bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级【分层图+spfa】
至死不用dijskstra系列2333,洛谷上T了一个点,开了O2才过
基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为0,表示免了这条边的边权,然后答案就是第0层的s到k层的t的最短路,因为0权边总是从上一层连到下一层,所以到达k层就表示走了k条0权边
这样的点数是nk的,不管是dijskstra还是spfa都跑不过
然后仔细观察这张图的特性,发现不同层之间的更新只有上一层通过0权边更新下一层,所以考虑单层更新,每一层都做一次spfa,然后跨层的时候用上一层跑过的最短路和0权边更新下一层
然后给spfa加一个SLF优化即可
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<ctime>
using namespace std;
const int N=50005,inf=1e9;
int n,m,k,h[N],cnt,dis[N],d[N];
bool v[N];
deque<int>q;
struct qwe
{
	int ne,no,to,va;
}e[N<<2];
int read()
{
	int r=0,f=1;
	char p=getchar();
	while(p>'9'||p<'0')
	{
		if(p=='-')
			f=-1;
		p=getchar();
	}
	while(p>='0'&&p<='9')
	{
		r=r*10+p-48;
		p=getchar();
	}
	return r*f;
}
inline void add(int u,int v,int w)
{
	cnt++;
	e[cnt].ne=h[u];
	e[cnt].no=u;
	e[cnt].to=v;
	e[cnt].va=w;
	h[u]=cnt;
}
void spfa()
{
	while(!q.empty())
	{
		int u=q.front();
		q.pop_front();
		v[u]=0;
		for(int i=h[u];i;i=e[i].ne)
			if(dis[e[i].to]>dis[u]+e[i].va)
			{
				dis[e[i].to]=dis[u]+e[i].va;
				if(!v[e[i].to])
				{
					v[e[i].to]=1;
					if(!q.empty()&&dis[q.front()]>dis[e[i].to])
						q.push_front(e[i].to);
					else
						q.push_back(e[i].to);
				}
			}
	}
}
int main()
{
	n=read(),m=read(),k=read();
	for(int i=1;i<=m;i++)
	{
		int x=read(),y=read(),z=read();
		add(x,y,z),add(y,x,z);
		// for(int j=0;j<=k;j++)
			// add(x+j*n,y+j*n,z),add(y+j*n,x+j*n,z);
		// for(int j=1;j<=k;j++)
			// add(x+(j-1)*n,y+j*n,0),add(y+(j-1)*n,x+j*n,0);
	}
	for(int i=1;i<=n;i++)
		dis[i]=inf;
	// clock_t st,ed;
	// st=clock();
	v[1]=1,dis[1]=0,q.push_back(1);
	spfa();
	for(int con=1;con<=k;con++)
	{
		for(int i=1;i<=n;i++)
			d[i]=inf;
		v[1]=1,dis[1]=0,q.push_back(1);
		for(int i=1;i<=cnt;i++)
			if(d[e[i].to]>dis[e[i].no])
			{
				d[e[i].to]=dis[e[i].no];
				if(!v[e[i].to])
				{
					v[e[i].to]=1;
					if(!q.empty()&&d[q.front()]>d[e[i].to])
						q.push_front(e[i].to);
					else
						q.push_back(e[i].to);
				}
			}
		for(int i=1;i<=n;i++)
			dis[i]=d[i];
		spfa();
	}
	// ed=clock();
	// cerr<<st<<" "<<ed<<" "<<ed-st<<endl;
	printf("%d\n",dis[n]);
	return 0;
}
												
											bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级【分层图+spfa】的更多相关文章
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级  -- 分层图最短路
		
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MB Description 每天,农夫 ...
 - BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级 分层图最短路 + Dijkstra
		
Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...
 - bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级——分层图+dijkstra
		
Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...
 - Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级  dijkstra,堆,分层图
		
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1573 Solv ...
 - BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级( 最短路 )
		
最短路...多加一维表示更新了多少条路 -------------------------------------------------------------------------------- ...
 - bzoj  1579: [Usaco2009 Feb]Revamping Trails 道路升级   优先队列+dij
		
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1768 Solv ...
 - 【bzoj1579】[Usaco2009 Feb]Revamping Trails 道路升级  分层图最短路
		
题目描述 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 < ...
 - BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级:dijkstra 分层图【将k条边改为0】
		
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1579 题意: 给你一个无向图,n个点,m条边,每条边有边权w[i]. 你可以将其中的k(k ...
 - BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级
		
堆优化的dijkstra. 把一个点拆成k个. 日常空间要开炸一次.. //Twenty #include<cstdio> #include<cstring> #include ...
 
随机推荐
- JavaWeb 项目,更改本地文件需刷新才有效问题 (tomcat相关)
			
问题 如果JavaWeb项目需要读取实时更新的本地文件内容,可能遇到必须在更新后手动refresh才能有效的问题. 原因 这是由于项目实际上是运行在Tomcat中,而非本地的工作目录.eclipse可 ...
 - Wireshark抓包工具的简单使用2(抓包、查看、过滤)
			
在简单了解了Wireshark的界面以及各工具栏的作用后,也要掌握如何进行抓包,查询,过滤等操作 一.抓包 1.打开软件,初始界面 2.点击Caputre-->Interfaces,出现当前所有 ...
 - 国王游戏(codevs 1198)
			
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...
 - AOJ -0033  Ball(DFS)
			
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=22516 一道需要思考的搜索题. 题意:十个球按给定顺序从图中所示容器中下落, ...
 - git一个本地仓库连接多个远程仓库
			
前言:由于公司的GIT是内网服务器,而在家工作访问不了内网服务器,由此想把本地仓库连接一个外网的GIT服务器(码云),方便不在公司时开发. 原文 某些场合,一个git项目需要能同时使用两个甚至多个远程 ...
 - lambda简单记录
			
lambda表达式对集合的一些操作,持续记录一下新的用法 List<Integer> list = new ArrayList<>(); list.add(1); list.a ...
 - GNS3模拟的硬件
			
Hardware emulated by GNS3 Cisco 1700 Series 1700s have one or more interfaces on the motherboard, 2 ...
 - IOS程序崩溃报告管理解决方案(Crashlytics  在2014-09-24)
			
预研Crashlytics 在2014-09-241:实现原理在原理上,Crashlytics通过以下2步完成崩溃日志的上传和分析:(1)提供应用SDK,你需要在应用启动时调用其SDK来设置你的应用 ...
 - dubbo的jmeter压测时jar包的热加载/动态加载
			
在做dubbo的jmeter压测时,需要把jar包放入jmeter的lib/ext目录下,但是jmeter启动的时候会自动加载这个目录lib目录及lib/ext目录,这样启动后放入这些目录下的jar包 ...
 - TCP打洞与UDP打洞的差别
			
为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 如果如今有内网clientA和内网clientB.有公网服务端S. 如果A和B ...