SPFA cojs 176. [USACO Feb07] 奶牛聚会

Posted tech-chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPFA cojs 176. [USACO Feb07] 奶牛聚会相关的知识,希望对你有一定的参考价值。

cojs 176. [USACO Feb07] 奶牛聚会

★☆   输入文件:sparty.in   输出文件:sparty.out   简单对比
时间限制:3 s   内存限制:16 MB

 

N(1 ≤ N ≤ 1000)个农场中的每个农场都有一只奶牛去参加位于第X个农场的聚会.共有M (1 ≤ M ≤ 100,000)条单向的道路,每条道路连接一对农场.通过道路i会花费Ti (1 ≤ Ti ≤ 100)的时间.

作为参加聚会的奶牛必须走到聚会的所在地(农场X).当聚会结束时,还要返回各自的农场.奶牛都是很懒的,她们想找出花费时间最少的路线.由于道路都是单向的,所有她们前往农场X的路线可能会不同于返程的路线.

Of all the cows, what is the longest amount of time a cow must spend walking to the party and back? 对于所有参加聚会的奶牛,找出前往聚会和返程花费总时间最多的奶牛,输出这只奶牛花费的总时间.


输入格式:

  • 第1行:三个用空格隔开的整数.

第2行到第M+1行,每行三个用空格隔开的整数:Ai, Bi,以及Ti.表示一条道路的起点,终点和需要花费的时间.


输出格式:

  • 唯一一行:一个整数: 所有参加聚会的奶牛中,需要花费总时间的最大值.

样例输出:

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

样例说明:

共有4只奶牛参加聚会,有8条路,聚会位于第2个农场.

第4只奶牛可以直接到聚会所在地(花费3时间),然后返程路线经过第1和第3个农场(花费7时间),总共10时间.

  1 #define N 100100
  2 #include<cstring>
  3 #include<iostream>
  4 using namespace std;
  5 #include<cstdio>
  6 int que[10000];
  7 int head1[1001],head2[1001];
  8 struct Edge{
  9     int v,last,w;
 10 }edge1[N],edge2[N];
 11 int t1=0,t2=0,n,m,x;
 12 int dis1[1001],dis2[1001],ans=0;
 13 void add_edge1(int u,int v,int w)
 14 {
 15     ++t1;
 16     edge1[t1].v=v;
 17     edge1[t1].w=w;
 18     edge1[t1].last=head1[u];
 19     head1[u]=t1;
 20 }
 21 void add_edge2(int u,int v,int w)
 22 {
 23     ++t2;
 24     edge2[t2].v=v;
 25     edge2[t2].w=w;
 26     edge2[t2].last=head2[u];
 27     head2[u]=t2;
 28 }
 29 void input()
 30 {
 31     scanf("%d%d%d",&n,&m,&x);
 32     for(int i=1;i<=m;++i)
 33     {
 34         int u,v,w;
 35         scanf("%d%d%d",&u,&v,&w);
 36         add_edge1(u,v,w);
 37         add_edge2(v,u,w);
 38     }
 39 }
 40 void SPFA1()
 41 {
 42     bool flag[1001]={0};
 43     memset(flag,false,sizeof(flag));
 44     int head=0,tail=0;
 45     que[++tail]=x;
 46     flag[x]=true;
 47     memset(dis1,99,sizeof(dis1));
 48     dis1[x]=0;
 49     while(head<tail)
 50     {
 51         ++head;
 52         int p=que[head];
 53         flag[p]=false;
 54         for(int l=head1[p];l;l=edge1[l].last)
 55         {
 56             if(dis1[edge1[l].v]>dis1[p]+edge1[l].w)
 57             {
 58                 dis1[edge1[l].v]=dis1[p]+edge1[l].w;
 59                 if(!flag[edge1[l].v])
 60                 {
 61                     ++tail;
 62                     que[tail]=edge1[l].v;
 63                     flag[edge1[l].v]=true;
 64                 }
 65                 
 66             }
 67         }
 68         
 69     }
 70 }
 71 void SPFA2()
 72 {
 73     bool flag[1001]={0};
 74     memset(flag,false,sizeof(flag));
 75     int head=0,tail=0;
 76     memset(que,0,sizeof(que));
 77     que[++tail]=x;
 78     flag[x]=true;
 79     memset(dis2,99,sizeof(dis2));
 80     dis2[x]=0;
 81     while(head<tail)
 82     {
 83         ++head;
 84         int p=que[head];
 85         flag[p]=false;
 86         for(int l=head2[p];l;l=edge2[l].last)
 87         {
 88             if(dis2[edge2[l].v]>dis2[p]+edge2[l].w)
 89             {
 90                 dis2[edge2[l].v]=dis2[p]+edge2[l].w;
 91                 if(!flag[edge2[l].v])
 92                 {
 93                     ++tail;
 94                     que[tail]=edge2[l].v;
 95                     flag[edge2[l].v]=true;
 96                 }
 97                 
 98             }
 99         }
100         
101     }
102 }
103 int main()
104 {
105     freopen("sparty.in","r",stdin);
106     freopen("sparty.out","w",stdout);
107     input();
108     SPFA1();
109     SPFA2();
110     for(int i=1;i<=n;++i)
111       ans=max(ans,dis1[i]+dis2[i]);
112     printf("%d\n",ans);
113     fclose(stdin);fclose(stdout);
114     return 0;
115 }

 

以上是关于SPFA cojs 176. [USACO Feb07] 奶牛聚会的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级分层图+spfa

BZOJ 1632 [Usaco2007 Feb]Lilypad Pond:spfa同时更新:经过边的数量最小路径数量

USACO07FEB银牛派对

bzoj 2015: [Usaco2010 Feb]Chocolate Givingspfa

[USACO14FEB]路障Roadblock

luogu P2939 [USACO09FEB]改造路Revamping Trails 题解