问题 C: 热浪

 

时间限制: 1 Sec  内存限制: 128 MB
提交: 70  解决: 28
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

    德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪! ! ! 他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。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 #include<cstdio>
 2 #include<iostream>
 3 #include<memory.h>
 4 using namespace std;
 5 struct node
 6 {
 7   int to,next,w;
 8 }e[13000];
 9 int h[2600],cnt,v[2600],d[2600],n,m,u,w,to,maxxx,s,l;
10 int read()
11 {
12   char ch;int f1=1,w=0;
13   while(ch<'0'||ch>'9') {if(ch=='-') f1=-1;ch=getchar();}
14   while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
15   return f1*w;
16 }
17 void add(int u,int w,int to)
18 {
19   cnt++;
20   e[cnt].to=to;
21   e[cnt].next=h[u];
22   e[cnt].w=w;
23   h[u]=cnt;
24 }
25 int main()
26 {
27   cin>>n>>m>>s>>l;
28   for(int i=1;i<=m;i++)
29   {
30     u=read();to=read();w=read();
31     add(u,w,to);
32     add(to,w,u);
33   }
34   memset(d,0x3f,sizeof(d));
35   d[s]=0;
36   for(int i=1;i<=n;i++)
37   {
38     int k=0,minn=1<<29;
39     for(int j=1;j<=n;j++)
40       if(v[j]==0&&d[j]<minn) k=j,minn=d[j];
41     for(int j=h[k];j>0;j=e[j].next)
42       if(d[e[j].to]>d[k]+e[j].w) d[e[j].to]=d[k]+e[j].w;
43     v[k]=1;
44   }
45   cout<<d[l];
46   return 0;
47 }
原文地址:https://www.cnblogs.com/5t2y0/p/10461454.html