kuangbin专题专题四 Silver Cow Party POJ - 3268

 

题目链接:https://vjudge.net/problem/POJ-3268

题意:点X处开办排队,其他点的牛到X点去参加派对,然后从X点回到各自的点,通路是单向的,所有牛都要走最短路,

求出所有牛走的最短路中最长的那条路。

(直接看代码吧,就是一处改一下,别的和dijkstra板子差不多)


  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <cstdio>
  5 #include <string>
  6 using namespace std;
  7  
  8 typedef long long LL;
  9 #define inf (1LL << 30) - 1
 10 #define rep(i,j,k) for(int i = (j); i <= (k); i++)
 11 #define rep__(i,j,k) for(int i = (j); i < (k); i++)
 12 #define per(i,j,k) for(int i = (j); i >= (k); i--)
 13 #define per__(i,j,k) for(int i = (j); i > (k); i--)
 14 
 15 const int N = 1010;
 16 int G[N][N];
 17 bool vis[N];
 18 int dis1[N];
 19 int dis2[N];
 20 int u,v,w;
 21 int n,m,X;
 22 
 23 void init(){
 24 
 25     rep(i,1,n) vis[i] = false;
 26     rep(i,1,n) rep(j,1,n){
 27         if(i == j) G[i][j] = 0;
 28         else G[i][j] = inf;
 29     }
 30 }
 31 
 32 void input(){
 33 
 34     rep(i,1,m){
 35         cin >> u >> v >> w;
 36         if(G[u][v] > w) G[u][v] = w;
 37     }
 38 }
 39 
 40 void dijkstra(){
 41 
 42 //////////////////////////////////////////////////////////
 43     //(1)第一部分
 44     rep(i,1,n) dis1[i] = G[i][X]; //dis[]存的是其他城市到X点的最短距离
 45     vis[X] = true;
 46 
 47     rep(i,2,n){
 48 
 49         int x = -1;
 50         int w = inf;
 51 
 52         rep(j,1,n){
 53             if(!vis[j] && w > dis1[j]) w = dis1[x = j];
 54         }
 55         if(x == -1) continue;
 56 
 57         vis[x] = true;
 58         rep(k,1,n){
 59             //如果k点到X点的距离 大于  k点到x点的距离加上x到X点的距离  那么更新dis[]数组
 60             if(!vis[k] && dis1[k] > dis1[x] + G[k][x]){
 61                 dis1[k] = dis1[x] + G[k][x];
 62             }
 63         }
 64     }
 65 
 66  //   rep(i,1,n) cout << dis1[i] << endl;
 67 
 68 ////////////////////////////////////////////////////////////
 69     //(2)第二部分  就是一模一样的dijkstra板子
 70     rep(i,1,n) vis[i] = false;
 71     rep(i,1,n) dis2[i] = G[X][i];
 72     vis[X] = true;
 73 
 74     rep(i,2,n){
 75         int x = -1;
 76         int w = inf;
 77 
 78         rep(j,1,n){
 79             if(!vis[j] && w > dis2[j]) w = dis2[x = j];
 80         }
 81 
 82         if(x == -1) continue;
 83 
 84         vis[x] = true; 
 85         rep(k,1,n){
 86             if(!vis[k] && dis2[k] > dis2[x] + G[x][k]){
 87                 dis2[k] = dis2[x] + G[x][k];
 88             }
 89         }
 90     }
 91     int ans = 0;
 92 
 93     //把来回的路线加起来,选出最长的那个来回,就是答案
 94     rep(i,1,n) if(i != X) ans = max(ans, dis1[i]+ dis2[i]);
 95 
 96     cout << ans << endl;
 97 }
 98 
 99 int main(){
100  
101     ios::sync_with_stdio(false);
102     cin.tie(0);
103 
104     cin >> n >> m >> X;
105 
106     init();
107     input();
108     dijkstra();
109 
110     getchar();getchar();
111     return 0;
112 }

 

posted @ 2019-07-17 23:16  SummerMingQAQ  阅读(244)  评论(0编辑  收藏  举报