今天上午好累啊。。木有什么精神写代码。。。
/* zoj_1291 最短路 dijkstra模板题,输入方式稍微注意下就好 */ #include <iostream> #include <string.h> #include <stdlib.h> #include <limits.h> #include <queue> #include <cstdio> using namespace std; int map[110][110]; bool flag[110]; int dijkstra( int start,int n ) { int i,j,mark,mini,last; int dist[110]; memset( flag,0,sizeof(flag) ); memset( dist,0,sizeof(dist) ); flag[start]=1; for( i=1;i<=n;i++ ) { mini=INT_MAX; for( j=1;j<=n;j++ ) { if( flag[j]==0 ) { if( map[start][j]!=0 && dist[j]>dist[start]+map[start][j] ) dist[j]=dist[start]+map[start][j]; else if( map[start][j]!=0 && dist[j]==0 ) dist[j]=dist[start]+map[start][j]; if( mini>dist[j] && dist[j]!=0 ) { mini=dist[j]; mark=j; } } } if( mini==INT_MAX ) break; start=mark; flag[start]=1; last=dist[start]; } return last; } int main() { int n,i,j,first,T; char t[10]; first=1; scanf( "%d",&T ); while( T-- ) { scanf("%d",&n); memset( map,0,sizeof(map) ); for( i=2;i<=n;i++ ) { for( j=1;j<i;j++ ) { scanf( "%s",t ); if( t=="X" ) map[i][j]=0; else map[i][j]=atoi( t ); map[j][i]=map[i][j]; } } /* for( i=1;i<=n;i++ ) { for( j=1;j<=n;j++ ) { cout<<map[i][j]<<" "; } cout<<endl; }*/ if( first!=1 ) printf( "\n" ); printf( "%d\n",dijkstra( 1,n ) ); first++; } return 0; }