[kuangbin带你飞]专题四 最短路练习 POJ 3268 Silver Cow Party

 

题意:

在一个有向图中求n头牛从自己的起点走到x再从x走回来的最远距离

思路一开始是暴力跑dij……

讲道理不太可能……

然后就百度了一下 才知道把矩阵转置的话就只需要求两次x的单源最短路……

 1 /* ***********************************************
 2 Author        :Sun Yuefeng
 3 Created Time  :2016/10/22 20:09:36
 4 File Name     :A.cpp
 5 ************************************************ */
 6 
 7 #include<cstdio>
 8 #include<iostream>
 9 #include<algorithm>
10 #include<cmath>
11 #include<cstring>
12 #include<string>
13 #include<bitset>
14 #include<map>
15 #include<set>
16 #include<stack>
17 #include<vector>
18 #include<queue>
19 #include<list>
20 #define M(a,b) memset(a,b,sizeof(a))
21 using namespace std;
22 typedef long long ll;
23 const int inf=0x3f3f3f3f;
24 const int maxn=1e3+10;
25 const int mod=1e7+7;
26 int dx[8]= {0,0,1,-1,1,-1,1,-1};
27 int dy[8]= {1,-1,0,0,-1,1,1,-1};
28 
29 int n,m,x,most;
30 int waycome[maxn][maxn];
31 int wayback[maxn][maxn];
32 int dist[maxn];
33 bool vis[maxn];
34 
35 void dijkstra(int x,int way[][maxn]){
36     int dis[maxn];
37     for(int i=1;i<=n;i++){
38         dis[i]=inf;
39         vis[i]=false;
40     }
41     dis[x]=0;
42     for(int i=1;i<=n;i++){
43         int k=-1;
44         int min=inf;
45         for(int j=1;j<=n;j++){
46             if(!vis[j]&&dis[j]<min){
47                 min=dis[j];
48                 k=j;
49             }
50         }
51         vis[k]=true;
52         for(int j=1;j<=n;j++){
53             if(dis[j]>dis[k]+way[k][j]&&!vis[j])
54                 dis[j]=dis[k]+way[k][j];
55         }
56     }
57     for(int i=1;i<=n;i++){
58         dist[i]+=dis[i];
59         if(dist[i]>most) most=dist[i];
60     }
61 }
62 
63 int main()
64 {
65     //freopen("in.txt","r",stdin);
66     //freopen("out.txt","w",stdout);
67     while(scanf("%d%d%d",&n,&m,&x)!=EOF){
68         M(waycome,inf);
69         M(wayback,inf);
70         M(dist,0);
71         int u,v,w;
72         most=-1;
73         for(int i=0;i<m;i++){
74             scanf("%d%d%d",&u,&v,&w);
75             waycome[u][v]=w;
76             wayback[v][u]=w;
77         }
78         dijkstra(x,waycome);
79         dijkstra(x,wayback);
80         printf("%d\n",most);
81     }
82     return 0;
83 }

 

posted @ 2016-10-22 21:31  良将ℓ  阅读(145)  评论(0编辑  收藏  举报