博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOIP模拟题】行动!行动!(spfa+优化)
阅读量:5939 次
发布时间:2019-06-19

本文共 2795 字,大约阅读时间需要 9 分钟。

spfa不加优化果断tle最后一个点。。。。。。。。。。。。。。。。。。。

这题和ch的一题很像,只不过这题简单点,这是一个层次图,即有很多个相同的图,这些相同的图之间又存在着练习。。

然后每一次队列存的状态是存两个信息的然后就玩了。。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;#define pii pair
#define mkpii make_pair
#define pdi pair
#define mkpdi make_pair
#define pli pair
#define mkpli make_pair
#define rep(i, n) for(int i=0; i<(n); ++i)#define for1(i,a,n) for(int i=(a);i<=(n);++i)#define for2(i,a,n) for(int i=(a);i<(n);++i)#define for3(i,a,n) for(int i=(a);i>=(n);--i)#define for4(i,a,n) for(int i=(a);i>(n);--i)#define CC(i,a) memset(i,a,sizeof(i))#define read(a) a=getint()#define print(a) printf("%d", a)#define dbg(x) cout << (#x) << " = " << (x) << endl#define error(x) (!(x)?puts("error"):0)#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endlinline const ll getint() { ll r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }inline const ll max(const ll &a, const ll &b) { return a>b?a:b; }inline const ll min(const ll &a, const ll &b) { return a
>2;int n, ihead[N], cnt, m, k, front, tail, vis[N][11];ll d[N][11];struct dat { int next, to; ll w; }e[N<<2];struct Queue { int u, k; }q[Q];void add(int u, int v, ll w) { e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v; e[cnt].w=w; e[++cnt].next=ihead[v]; ihead[v]=cnt; e[cnt].to=u; e[cnt].w=w;}void spfa(int s) { rep(i, n) for1(j, 0, k) d[i][j]=oo; d[s][k]=0; q[tail++]=(Queue){s, k}; vis[s][k]=1; while(front!=tail) { int u=q[front].u, now=q[front++].k, v; if(front==Q) front=0; vis[u][now]=0; //dbg(u); dbg(now); dbg(d[u][now]); for(int i=ihead[u]; i; i=e[i].next) { v=e[i].to; if(d[v][now]>d[u][now]+e[i].w) { d[v][now]=d[u][now]+e[i].w; //dbg(v); dbg(now); dbg(d[v][now]); //puts("1"); dbg(v); dbg(now); dbg(d[v][now]); if(!vis[v][now]) { if(d[v][now]
0 && d[v][now-1]>d[u][now]) { d[v][now-1]=d[u][now]; //puts("2");dbg(v); dbg(now-1); dbg(d[v][now-1]); puts(""); if(d[v][now-1]

  

 


 

 

 

题目描述:

大CX国的大兵Jack接到一项任务:敌方占领了n座城市(编号0~n-1),有些城市之间有双向道路相连。Jack需要空降在一个城市S,并徒步沿那些道路移动到T城市。虽然Jack每从一个城市到另一个城市都会受伤流血,但大CX国毕竟有着“过硬”的军事实力,它不仅已经算出Jack在每条道路上会损失的血量,还给Jack提供了k个“简易急救包”,一个包可以让Jack在一条路上的流血量为0。Jack想知道自己最少会流多少血,不过他毕竟是无脑的大兵,需要你的帮助。

输入描述:

第一行有三个整数n,m,k,分别表示城市数,道路数和急救包个数。

第二行有两个整数,S,T。分别表示Jack空降到的城市编号和最终要到的城市。

接下来有m行,每行三个整数a,b,c,表示城市a与城市b之间有一条双向道路。

输出描述:

Jack最少要流的血量。

样例输入:

5 6 1

0 3

3 4 5

0 1 5

0 2 100

1 2 5

2 4 5

2 4 3

样例输出:

8

数据范围:

对于30%的数据,2<=n<=50,1<=m<=300,k=0;

对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;

对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.

转载地址:http://ydmtx.baihongyu.com/

你可能感兴趣的文章
视频转成flv格式
查看>>
英特尔分拆McAfee:31亿美元将多数股权卖给投资公司TPG
查看>>
AWS S3宕机的启发: 云必须分散化
查看>>
零基础学习SVN之(二):CVS与SVN的区别
查看>>
HP Webinspect 10 访问wap的url
查看>>
单元测试Struts2的Action(包含源码)
查看>>
Linux存储入门:简易数据恢复方案--分区和LVM实战
查看>>
客服运营三部曲
查看>>
思科分析引擎助力大型数据中心应用发展
查看>>
7 种常用的排序算法直观感受
查看>>
程序员,告诉他们被打断的真实代价
查看>>
2017 年 VR 将走的 3 个方向 你更认可哪一个?
查看>>
《Docker技术入门与实战》——2.4 本章小结
查看>>
《ZEMAX光学设计超级学习手册》一一2.6 本章小结
查看>>
《Spark大数据分析实战》——1.4节弹性分布式数据集
查看>>
《高级无线网络—4G技术》——1.3 混合4G无线网络协议
查看>>
勒索病毒一周记:它让我们得到了什么经验教训?
查看>>
《研发企业管理——思想、方法、流程和工具》——1.11 论成本
查看>>
《Python硬件编程实战》——2.8 在Mac中安装Python
查看>>
《iOS应用开发指南——使用HTML5、CSS3和JavaScript》——导读
查看>>