首页 > 代码库 > POJ 1511 Invitation Cards
POJ 1511 Invitation Cards
题目来源:http://poj.org/problem?id=1511
题目很长,花了不少时间才理解题意,目的就是为了求出来回两次最小路径(即为本题的差旅费)之和,
第一次从CCS(1)出发到各个点路径最小,SPFA算法没得说,回来时终点是确定的都是CCS(1),相当于把路
径反过来,即把有向图去反方向,又是从1出发到各个点路径最小,再用一个SPFA。注意ans要用long long
不然也WA,这个地方WA了好几次,虽然更改后AC了,但还是不明白,题目明明写了smaller than 1000000000,
真是无语。
1 #include<stdio.h> 2 #include<string.h> 3 #define INF 0x3f3f3f3f 4 const int maxn=1000000+10; 5 int u[maxn],v[maxn],w[maxn],next[maxn],first[maxn],dist[maxn],que[maxn]; 6 bool inq[maxn]; 7 void add_edge(int a,int e) 8 { 9 next[e]=first[a];10 first[a]=e;11 }12 void spfa(void)13 {14 int head,tail;15 dist[1]=0;16 que[head=tail=0]=1;17 tail++;18 inq[1]=true;19 while(head!=tail){20 int a=que[head];21 head=(head+1)%maxn;22 inq[a]=false;23 for(int e=first[a];e!=-1;e=next[e]){24 if(dist[v[e]]>dist[a]+w[e]){25 dist[v[e]]=dist[a]+w[e];26 if(!inq[v[e]]){27 inq[v[e]]=true;28 que[tail]=v[e];29 tail=(tail+1)%maxn;30 }31 }32 }33 }34 }35 int main()36 {37 int t,q,p;38 scanf("%d",&t);39 while(t--){40 scanf("%d%d",&p,&q);41 memset(first,-1,sizeof(int)*(p+1));42 for(int e=1;e<=q;e++){43 scanf("%d%d%d",&u[e],&v[e],&w[e]);44 add_edge(u[e],e);45 }46 memset(dist,0x3f,sizeof(int)*(p+1));47 memset(inq,false,sizeof(bool)*(p+1));48 spfa();49 long long ans=0;50 for(int i=1;i<=p;i++)51 ans+=dist[i];52 memset(first,-1,sizeof(int)*(p+1));53 for(int e=1;e<=q;e++){54 int t=u[e];55 u[e]=v[e];56 v[e]=t;57 add_edge(u[e],e);58 }59 memset(dist,0x3f,sizeof(int)*(p+1));60 memset(inq,false,sizeof(bool)*(p+1));61 spfa();62 for(int i=1;i<=p;i++)63 ans+=dist[i];64 printf("%lld\n",ans);65 }66 return 0;67 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。