Coder Space

PKU 3268 Silver Cow Party --- 两点间最短路径

输入的N条边构成邻接矩阵adj[][],将边反向,建立返回路径邻接矩阵ret[][],分别对这两个邻接矩阵运用Dijkstra算法,求到X的最短路,对应顶点两条最短路和的最大值即为所求。

 
 1 #include<iostream>
 2 #include<limits>
 3 
 4 using namespace std;
 5 
 6 const int maxN = 1001;
 7 const int INF = numeric_limits<int>::max();
 8 
 9 int adj[maxN][maxN];           //去时邻接矩阵
10 int ret[maxN][maxN];           //返回时邻接矩阵
11 
12 int res[2][maxN];
13 
14 void Dijkstra(int n, int s[][maxN], int dist[],int v)
15 {
16     bool flag[maxN];
17     for(int i=1;i<=n;i++)
18     {
19         flag[i] = false;
20         dist[i] = s[v][i];
21     }
22     dist[v] = 0;
23     flag[v] = true;
24 
25     for(int i=1;i<n;i++)
26     {
27         int temp = INF;
28         int u = v;
29         for(int j=1;j<=n;j++)
30         {
31             if((!flag[j]) && dist[j] < temp)
32             {
33                 temp = dist[j];
34                 u = j;
35             }
36         }
37         flag[u] = true;
38 
39         for(int j=1;j<=n;j++)
40         {
41             if((!flag[j]) && s[u][j] != INF)
42             {
43                 int newDist = dist[u] + s[u][j];
44                 if(newDist < dist[j])
45                 {
46                     dist[j] = newDist;
47                 }
48             }
49         }
50     }
51 }
52 
53 int main()
54 {
55     int N,M,X;
56     int a,b,t;
57     int maxT;
58 
59     int i,j;
60 
61     while(cin>>N>>M>>X)
62     {
63         for(i=1;i<=N;i++)
64         {
65             for(j=1;j<=N;j++)
66             {
67                 adj[i][j] = INF;
68                 ret[i][j] = INF;
69             }
70         }
71 
72         for(i=0;i<M;i++)
73         {
74             cin>>a>>b>>t;
75             adj[a][b] = t;
76             ret[b][a] = t;
77         }
78 
79         Dijkstra(N,adj,res[0],X);
80         Dijkstra(N,ret,res[1],X);
81 
82         maxT = 0;
83 
84         for(i=1;i<=N;i++)
85         {
86             if(maxT < (res[0][i] + res[1][i]))
87             {
88                 maxT = res[0][i] + res[1][i];
89             }
90         }
91 
92         cout<<maxT<<endl;
93     }
94 }

posted on 2010-05-07 16:58 David Liu 阅读(105) 评论(0)  编辑 收藏 引用 所属分类: 图论


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

常用链接

留言簿

文章分类

文章档案

搜索

最新评论