农场派对(party)(信息学奥赛一本通 1497)

【题目描述】

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 }

 

猜你喜欢

转载自www.cnblogs.com/ljy-endl/p/11285884.html