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 }

 

你可能感兴趣的:(poj)