POJ 3268 Silver Cow Party
http://poj.org/problem?id=3268
不知道怎么回事,问题感觉今天读不懂题..题目要求求有向图中,除X外其余所有点到X的最短往返路径中,最长的那一个.FLOYD算法可以很容易的求出有向图中任意两点的最短路径,但是此题用FLOYD会超时.先用一次Dijkstra,求出从X到其余所有点的最短路径(这相当于回来时的长度),然后将这些路径记录,再将邻接矩阵转置,再用一次Dijkstra,将两次路径相加,找出最大的就可以了
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define INF 0x0fffffff 4 int M,N,X; 5 int mat[1005][1005]; 6 int nearest_array[1005]; 7 int final[1005]; 8 void dijkstra() 9 { 10 bool visited[1002]={false}; 11 int min=-1*INF; 12 int pos; 13 int i,j; 14 for(i=1;i<=N;i++) 15 nearest_array[i]=mat[X][i]; 16 visited[X]=true; 17 nearest_array[X]=0; 18 for(i=1;i<N;i++) { 19 min=INF; 20 pos=0; 21 for(j=1;j<=N;j++) { 22 if(!visited[j]&&nearest_array[j]<min) { 23 min=nearest_array[j]; 24 pos=j; 25 } 26 } 27 visited[pos]=true; 28 for(j=1;j<=N;j++) { 29 if(!visited[j]&&nearest_array[j]>min+mat[pos][j]) 30 nearest_array[j]=min+mat[pos][j]; 31 } 32 } 33 } 34 35 void init() 36 { 37 int i,j; 38 for(i=1;i<=N;i++) 39 for(j=1;j<=N;j++) 40 mat[i][j]=INF; 41 } 42 void roate() 43 { 44 int i,j,temp; 45 for(i=1;i<=N;i++) 46 for(j=1;j<i;j++) { 47 temp=mat[i][j]; 48 mat[i][j]=mat[j][i]; 49 mat[j][i]=temp; 50 } 51 } 52 void check_mat() 53 { 54 int i,j; 55 for(i=1;i<=N;i++) { 56 printf("\n"); 57 for(j=1;j<=N;j++) 58 printf("%10d ",mat[i][j]); 59 } 60 } 61 int main() 62 { 63 while(scanf("%d%d%d",&N,&M,&X)!=EOF) { 64 int i,j,a,b,temp; 65 init(); 66 for(i=1;i<=M;i++) { 67 scanf("%d%d%d",&a,&b,&temp); 68 mat[a][b]=temp; 69 } 70 /*check_mat();*/ 71 dijkstra(); 72 for(i=1;i<=N;i++) 73 final[i]=nearest_array[i]; 74 roate(); 75 dijkstra(); 76 int max_time=0; 77 for(i=1;i<=N;i++) 78 if(max_time<final[i]+nearest_array[i]) 79 max_time=final[i]+nearest_array[i]; 80 printf("%d\n",max_time); 81 } 82 return 0; 83 }