POJ1502(MPI Maelstrom)

题目链接

最短路的题,直接用dijkstra即可。此题比较有技巧性的地方在数据读入的处理,题中给出的是邻接矩阵的下三角,其中不直接邻接的边用字符x表示,其他地方用整数表示边长。具体做法见代码(参考了discuss)。

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MIN(a,b) ((a)<(b)?(a):(b))
 4 #define MAX(a,b) ((a)>(b)?(a):(b))
 5 #define N 101
 6 #define INF 0x7ffffff
 7 int g[N][N],n;
 8 int dist[N];
 9 char vis[N];
10 void dijkstra(int u)
11 {
12     int i,v,k,min;
13     memset(vis,0,sizeof(vis));
14     for(i=0;i<n;i++)    dist[i]=(i==u?0:INF);
15     for(i=0;i<n;i++)
16     {
17         min=INF;
18         for(v=0;v<n;v++)    if(!vis[v]&&dist[v]<=min)   min=dist[k=v];
19         vis[k]=1;
20         for(v=0;v<n;v++)    dist[v]=MIN(dist[v],dist[k]+g[k][v]);
21     }
22 }
23 int main()
24 {
25     int i,j,t,ans;
26     while(~scanf("%d",&n))
27     {
28         for(i=0;i<n;i++)
29         {
30             for(j=i+1;j<n;j++)  g[i][j]=g[j][i]=INF;
31         }
32         for(i=1;i<n;i++)
33         {
34             for(j=0;j<i;j++)
35             {
36                 if(scanf("%d",&t))  g[i][j]=g[j][i]=t;
37                 else    scanf("x");
38             }
39         }
40         dijkstra(0);
41         ans=0;
42         for(i=1;i<n;i++)    ans=MAX(ans,dist[i]);
43         printf("%d\n",ans);
44     }
45     return 0;
46 }

 

posted @ 2012-04-22 14:09  BeatLJ  阅读(988)  评论(0编辑  收藏  举报