最短路的题,直接用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 }