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 }

 

posted @ 2013-02-28 14:24  linyvxiang  阅读(202)  评论(0编辑  收藏  举报