【题目描述】
N(1≤N≤1000)头牛要去参加一场在编号为 x(1≤x≤N) 的牛的农场举行的派对。有 M(1≤M≤100000) 条有向道路,每条路长 Ti(1≤Ti≤100);每头牛都必须参加完派对后回到家,每头牛都会选择最短路径。求这 N头牛的最短路径(一个来回)中最长的一条的长度。 特别提醒:可能有权值不同的重边。
【输入】
第 1行:3 个空格分开的整数 N,M,X;
第 2…M 行:3 个空格分开的整数 Ai,Bi,Ti ,表示有一条从 Ai 到 Bi的路,长度为 Ti。
【输出】
一行一个数,表示最长最短路的长度(<231-1)。
【输入样例】
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
【输出样例】
10
用spfa求从x到各点的最短路径(di[i])以及从各点到x的最短路径(d[x]),并用邻接表进行优化
1 #include<bits/stdc++.h>
2 using namespace std;
3 struct node{
4 int to,next,w;
5 }a[21000];
6 queue<int>q;
7 int n,m,x,num,head[100001],ma=-1,mi,cnt;
8 int d[10001],z[1001][1001],di[10001];
9 bool b[10001];
10 void add(int from,int to,int w)
11 {
12 a[++cnt].to=to;
13 a[cnt].next=head[from];
14 a[cnt].w=w;
15 head[from]=cnt;
16 }
17 void spfa(int s)
18 {
19 memset(d,127,sizeof(d));
20 d[s]=0;b[s]=true;
21 q.push(s);
22 while(!q.empty())
23 {
24 int u=q.front();q.pop();
25 for(int i=head[u];i;i=a[i].next)
26 {
27 int to=a[i].to;
28 if(d[to]>d[u]+a[i].w)
29 {
30 d[to]=d[u]+a[i].w;
31 if(!b[to])
32 {
33 b[to]=true;
34 q.push(to);
35 }
36 }
37 }
38 b[u]=false;//别忘了这句话
39 }
40 }
41 int main()
42 {
43 //freopen("party.in","r",stdin);
44 //freopen("party.out","w",stdout);
45 cin>>n>>m>>x;
46 for(int i=1;i<=m;i++)
47 {
48 int a,b,c;
49 cin>>a>>b>>c;
50 add(a,b,c);
51 }
52 spfa(x);//从x到各点的最短路径
53 memcpy(di,d,sizeof d);//将数组d的值全部复制给di
54 for(int i=1;i<=n;i++)
55 {
56 if(i!=x)
57 {
58 spfa(i);//各点到x的最短路径
59 ma=max(ma,d[x]+di[i]);//求最短中的最长
60 }
61 }
62 cout<<ma;
63 return 0;
64 }