【题目描述】
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 }