USCAO 热浪

以下是题目详情:

得克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪!!! 他们的得克萨斯长角牛吃起来不错,
可是他们并不是很擅长生产富含奶油的乳制品。 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。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值