以下是题目详情:
得克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪!!! 他们的得克萨斯长角牛吃起来不错,
可是他们并不是很擅长生产富含奶油的乳制品。 Farmer John此时以先天下之忧而忧,后天下
之乐而乐的精神,身先士卒地承担起向得克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德
克萨斯人忍受酷暑的痛苦。
FJ已经研究过可以把牛奶从威斯康星运送到得克萨斯州的路线。 这些路线包括起始点和终点先
一共经过T (1 <= T <= 2,500)个城镇,方便地标号为1到T。 除了起点和终点外地每个城镇
由两条双向道路连向至少两个其它地城镇。 每条道路有一个通过费用(包括油费,过路费等等)。
考虑这个有7个城镇的地图。 城镇5是奶源,城镇4是终点(括号内的数字是道路的通过费用)。
[1]----1---[3]-
/ \
[3]---6---[4]---3--[3]--4
/ / /|
5 --[3]-- --[2]- |
\ / / |
[5]---7---[2]--2---[3]---
| /
[1]------
经过路线5-6-3-4总共需要花费3 (5->6) + 4 (6->3) + 3 (3->4) = 10的费用。
给定一个地图,包含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)最小的总费用。
分值: 300
题目名称: heatwv
输入格式:
* 第一行: 4个由空格隔开的整数: T, C, Ts, Te
* 第2到第C+1行: 第i+1行描述第i条道路。 有3个由空格隔开的整数: Rs, Re和Ci
样例输入 (文件 heatwv.in):
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
输入细节:
跟题目描述的地图一致。
输出格式:
* 第一行: 一个单独的整数表示Ts到Te的最小费用。 数据保证至少存在一条道路。
样例输出 (文件 heatwv.out):
7
输出细节:
5->6->1->4 (3 + 1 + 3)
很显然,这道题可以用SPFA做(也许是废话)。
在这里,我采用边表存储。
边表:
struct node
{
int w;//代表边权
int to;//这条边到的点
};
vector<struct node>edge[14000];
SPFA
void spfa(int pos)//pos是起始点
{
dis[pos]=0;
qu.push(pos);
fq[pos]=1;
while(!qu.empty())//队列优化
{
int u=qu.front();
qu.pop();
fq[u]=0;
for(int i=0;i<edge[u].size();i++)//处理第i个点
{
if(dis[edge[u][i].to]>dis[u]+edge[u][i].w)//松弛操作
{
dis[edge[u][i].to]=dis[u]+edge[u][i].w;
if(fq[edge[u][i].to]==0)
{
qu.push(edge[u][i].to);
fq[edge[u][i].to]=1;
}
}
}
}
}
主程序
应该不用过多赘述了
int main()
{
scanf("%d%d%d%d",&t,&c,&ts,&te);//读入
for(int i=0;i<=t;i++)
dis[i]=9999999;
for(int i=1;i<=c;i++)
{
int x,y,w;
struct node q;
scanf("%d%d%d",&x,&y,&w);
q.to=y;
q.w=w;
edge[x].push_back(q);
q.to=x;
edge[y].push_back(q);
}
spfa(ts);
printf("%d",dis[te]);
return 0;
}
很标准的SPFA题。
友链:推箱子http://blog.csdn.net/qq_37387365/article/details/57433058。