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 }