poj 3268 最短路dijkstra *

题目大意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出

链接:点我

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 #define pb(a) push_back(a)
11 const int INF=0x3f3f3f3f;
12 const double eps=1e-5;
13 typedef long long ll;
14 #define cl(a) memset(a,0,sizeof(a))
15 #define ts printf("*****
");
16 int n,m,tt,cnt;
17 const int MAXN=1010;
18 #define typec int
19 bool vis[MAXN];
20 int pre[MAXN];
21 int cost[MAXN][MAXN];
22 int dist1[MAXN],dist2[MAXN];
23 void Dijkstra(typec lowcost[],int n,int beg)
24 {
25     for(int i=1;i<=n;i++)
26     {
27         lowcost[i]=INF;vis[i]=false;pre[i]=-1;
28     }
29     lowcost[beg]=0;
30     for(int j=0;j<n;j++)
31     {
32         int k=-1;
33         int Min=INF;
34         for(int i=1;i<=n;i++)
35         if(!vis[i]&&lowcost[i]<Min)
36         {
37             Min=lowcost[i];
38             k=i;
39         }
40         if(k==-1)break;
41         vis[k]=true;
42         for(int i=1;i<=n;i++)
43         if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])
44         {
45             lowcost[i]=lowcost[k]+cost[k][i];
46             pre[i]=k;
47         }
48     }
49 }
50 int main()
51 {
52     int i,j,k;
53     #ifndef ONLINE_JUDGE
54     freopen("1.in","r",stdin);
55     #endif
56     int x;
57     while(scanf("%d%d%d",&n,&m,&x)!=EOF)
58     {
59         for(i=1;i<=n;i++)   for(j=1;j<=n;j++)   if(i==j)    cost[i][j]=0;else   cost[i][j]=INF;
60         int u,v,w;
61         for(i=0;i<m;i++)
62         {
63             scanf("%d%d%d",&u,&v,&w);
64             cost[u][v]=min(cost[u][v],w);
65         }
66         Dijkstra(dist1,n,x);
67         for(i=1;i<=n;i++)
68         {
69             for(j=1;j<i;j++)   swap(cost[i][j],cost[j][i]);
70         }
71         Dijkstra(dist2,n,x);
72         int ans=0;
73         for(i=1;i<=n;i++)
74             ans=max(ans,dist1[i]+dist2[i]);
75         printf("%d
",ans);
76     }
77 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4587961.html