洛谷P1339 热浪
题目描述
德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是 很擅长生產富含奶油的乳製品。Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。
FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。这些路线包括起始点和终点先一共经过T (1 <= T <= 2,500)个城镇,方便地标号為1到T。除了起点和终点外地每个城镇由两条双向道路连向至少两个其它地城镇。每条道路有一个通过费用(包括油费,过路费 等等)。
给定一个地图,包含C (1 <= C <= 6,200)条直接连接2个城镇的道路。每条道路由道路的起点Rs,终点Re (1 <= Rs <= T; 1 <= Re <= T),和花费(1 <= Ci <= 1,000)组成。求从起始的城镇Ts (1 <= Ts <= T)到终点的城镇Te(1 <= Te <= T)最小的总费用。
输入输出格式
输入格式:第一行: 4个由空格隔开的整数: T, C, Ts, Te
第2到第C+1行: 第i+1行描述第i条道路。有3个由空格隔开的整数: Rs, Re和Ci
输出格式:一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。
输入输出样例
输入样例#1:
7 11 5 4 2 4 2 1 4 3 7 2 2 3 4 3 5 7 5 7 3 3 6 1 1 6 3 4 2 4 3 5 6 3 7 2 1
输出样例#1:
7
说明
【样例说明】
5->6->1->4 (3 + 1 + 3)
题都没看直接扔了个floyd上去,T了以后才看题,无脑SPFA……好像最短路我只会写SPFA了
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int mxn=3000; 8 int dis[mxn]; 9 int q[65536],hd,tl; 10 int n,c,s,t; 11 int mp[mxn][mxn]; 12 int inq[mxn]; 13 void SPFA(){ 14 memset(dis,0x3f,sizeof dis); 15 hd=0;tl=1; 16 q[++hd]=s; 17 dis[s]=0; 18 inq[s]=1; 19 while(hd<=tl){ 20 int u=q[hd]; 21 for(int i=1;i<=n;i++){ 22 if(u==i)continue; 23 if(dis[i]>dis[u]+mp[u][i]) 24 { 25 dis[i]=dis[u]+mp[u][i]; 26 if(!inq[i]){ 27 inq[i]=1; q[++tl]=i; 28 } 29 } 30 } 31 inq[u]=0; 32 ++hd; 33 } 34 return; 35 } 36 int main(){ 37 memset(mp,0x3f,sizeof mp); 38 int i,j; 39 scanf("%d%d%d%d",&n,&c,&s,&t); 40 int x,y,d; 41 for(i=1;i<=c;i++){ 42 scanf("%d%d%d",&x,&y,&d); 43 mp[x][y]=mp[y][x]=d; 44 } 45 SPFA(); 46 printf("%d\n",dis[t]); 47 return 0; 48 } 49 50 51 /* 52 #include<iostream> 53 #include<cstdio> 54 #include<cmath> 55 #include<cstring> 56 #include<algorithm> 57 using namespace std; 58 const int mxn=3000; 59 int mp[mxn][mxn]; 60 int T,C; 61 int ts,te; 62 int main(){ 63 memset(mp,0x3f,sizeof mp); 64 int i,j; 65 scanf("%d%d%d%d",&T,&C,&ts,&te); 66 int x,y,d; 67 for(i=1;i<=C;i++){ 68 scanf("%d%d%d",&x,&y,&d); 69 mp[x][y]=mp[y][x]=d; 70 } 71 int k; 72 for(k=1;k<=T;k++) 73 for(i=1;i<=T;i++) 74 for(j=1;j<=T;j++){ 75 if(i!=j) 76 mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); 77 } 78 printf("%d\n",mp[ts][te]); 79 return 0; 80 } 81 */
本文为博主原创文章,转载请注明出处。