洛谷1339 热浪
本题地址: http://www.luogu.org/problem/show?pid=1339
题目描述
德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。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)
【思路】
最短路。
【代码】(模板)
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 6 const int maxn = 2500+10 , maxm=6200+10; 7 const int INF=1<<30; 8 struct Edge{ 9 int v,w,next; 10 }e[maxm*2]; 11 int en,front[maxn]; 12 int n,m,s,t; 13 14 inline void AddEdge(int u,int v,int w) { 15 en++; e[en].v=v; e[en].w=w; e[en].next=front[u]; front[u]=en; 16 } 17 18 void SPFA(); 19 void Dijkstra(); 20 21 int main() { 22 memset(front,-1,sizeof(front)); 23 scanf("%d%d%d%d",&n,&m,&s,&t); 24 int u,v,w; 25 for(int i=1;i<=m;i++) { 26 scanf("%d%d%d",&u,&v,&w); 27 AddEdge(u,v,w); 28 AddEdge(v,u,w); 29 } 30 Dijkstra(); 31 return 0; 32 } 33 34 //SPFA 最坏O(nm) 实践性很好 35 //15ms 36 void SPFA() { 37 int inq[maxn],d[maxn]; 38 queue<int> q; 39 memset(inq,0,sizeof(inq)); 40 for(int i=1;i<=n;i++) d[i]=INF; 41 42 d[s]=0; inq[s]=1; q.push(s); 43 while(!q.empty()) { 44 int u=q.front(); q.pop(); inq[u]=0; 45 for(int i=front[u];i>=0;i=e[i].next) { 46 int v=e[i].v,w=e[i].w; 47 if(d[v]>d[u]+w) { 48 d[v]=d[u]+w; 49 if(!inq[v]) { 50 inq[v]=1; 51 q.push(v); 52 } 53 } 54 } 55 } 56 printf("%d ",d[t]); 57 } 58 59 //Dijkstra O(mlogn) 60 //496ms 61 struct HeapNode{ 62 int u,d; 63 bool operator<(const HeapNode& rhs) const{ 64 return d<rhs.d; 65 } 66 }; 67 void Dijkstra() { 68 int d[maxn]; 69 priority_queue<HeapNode> q; 70 for(int i=1;i<=n;i++) d[i]=INF; 71 72 d[s]=0; 73 q.push((HeapNode){s,d[s]}); 74 while(!q.empty()){ 75 HeapNode x=q.top(); q.pop(); 76 int u=x.u; 77 if(x.d != d[u]) continue; 78 for(int i=front[u];i>=0;i=e[i].next){ 79 int v=e[i].v,w=e[i].w; 80 if(d[u]+w<d[v]) { 81 d[v]=d[u]+w; 82 q.push((HeapNode){v,d[v]}); 83 } 84 } 85 } 86 printf("%d ",d[t]); 87 }