CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路
描述
灾后重建(rebuild)
B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。
给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向的。并给出第i个村庄重建完成的时间t[i],你可以认为是同时开始重建并在第t[i]天重建完成,并且在当天即可通车。若t[i]为0则说明地震未对此地区造成损坏,一开始就可以通车。之后有Q个询问(x, y, t),对于每个询问你要回答在第t天,从村庄x到村庄y的最短路径长度为多少。如果无法找到从x村庄到y村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄y在第t天仍未重建完成 ,则需要返回-1。
输入格式
输入文件rebuild.in的第一行包含两个正整数N,M,表示了村庄的数目与公路的长度。
第二行包含N个非负整数t[0], t[1], …, t[N – 1],表示了每个村庄重建完成的时间,数据保证了t[0] ≤ t[1] ≤ … ≤ t[N – 1]。
接下来M行,每行3个非负整数i, j, w,w为不超过10000的正整数,表示了有一条连接村庄i与村庄j的道路,长度为w,保证i≠j,且对于任意一对村庄只会存在一条道路。
接下来一行也就是M+3行包含一个正整数Q,表示Q个询问。
接下来Q行,每行3个非负整数x, y, t,询问在第t天,从村庄x到村庄y的最短路径长度为多少,数据保证了t是不下降的。
输出格式
输出文件rebuild.out包含Q行,对每一个询问(x, y, t)输出对应的答案,即在第t天,从村庄x到村庄y的最短路径长度为多少。如果在第t天无法找到从x村庄到y村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄y在第t天仍未修复完成,则输出-1。
测试样例1
输入
4 5
1 2 3 4
0 2 1
2 3 1
3 1 2
2 1 4
0 3 5
4
2 0 2
0 1 2
0 1 3
0 1 4
输出
-1
-1
5
4
备注
【数据规模】
对于30%的数据,有N≤50;
对于30%的数据,有t[i] = 0,其中有20%的数据有t[i] = 0且N>50;
对于50%的数据,有Q≤100;
对于100%的数据,有N≤200,M≤N*(N-1)/2,Q≤50000,所有输入数据涉及整数均不超过100000。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; int n,m,point=;
int T[],g[][],note[];//下标从0开始 void init_(){
memset(g,-,sizeof(g));
scanf("%d%d",&n,&m); for(int i=;i<n;i++){
scanf("%d",&T[i]);
if(T[i]==) note[i]=,point=i;
}
for(int i=;i<=m;i++){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
g[x][y]=w;
g[y][x]=w;
}
} void floyd(int x){
point=x+,note[x]=; for(int i=;i<n;i++){//更新到x的距离
for(int j=;j<n;j++){
if(note[i] && note[j] && g[i][j]!=- && g[j][x]!=-){
if(g[i][j]+g[j][x]<g[i][x] || g[i][x]==-){
g[x][i]=g[i][x]=g[i][j]+g[j][x];
}
}
}
} for(int i=;i<n;i++){//更新以x为中继的点
for(int j=;j<n;j++){
if(note[i] && note[j] && g[i][x]!=- && g[x][j]!=-){
if(g[i][x]+g[x][j]<g[i][j] || g[i][j]==-){
g[i][j]=g[i][x]+g[x][j];
}
}
}
}
} void solve(){
int x,y,t,ask;
scanf("%d",&ask); if(point!=){//对T[i]=0的点先进行最短路
for(int k=;k<=point;k++)
for(int i=;i<=point;i++)
for(int j=;j<=point;j++)
if(g[i][k]!=- && g[k][j]!=-)
if(g[i][k]+g[k][j]<g[i][j] || g[i][j]==-)
g[i][j]=g[i][k]+g[k][j];
} while(ask--){
scanf("%d%d%d",&x,&y,&t);
while(t>=T[point] && point<n) floyd(point);
if( note[x] && note[y] ) printf("%d\n",g[x][y]);
else puts("-1");
}
} int main(){
// freopen("01.in","r",stdin);
init_();
solve();
return ;
}不知道为什么洛谷过不了,TYVJ 和 CODEVS 都可以过
当然可以在线floyd,O(n^4),可以过4个点(我是不会说我之前就是这么做的)
转个题解:
数据规模比较小,所以用矩阵+离线floyd(在线spfa貌似要超时)
floyd算法中枚举的k是中转点,在这道题中就可以按时间顺序把点当作中转点,挨个儿加入图中,并且同时将‘时间恰当的询问’求出来(是指询问的时间<=t[k]的询问)
﹡注意题中所给的数据已经排好了序
最小瓶颈路:
题目大意:有一些村庄与它们之间的通路(即是图中的顶点和边),每条通路都有一个修复时间,要求何时所有村庄都可以连通。
其实就是一个无向带权图,要求最小瓶颈生成树(这棵树的边的最大值为这棵树的值)。可以用prim算法与kruskal算法。也可以用dijkstra算法。
为什么可以用dijkstra算法?首先,所有边权值非负。然后可以发现,当两个村庄相通时,它们的最短路(指的是瓶颈最短路)即为它们相通的最短时间,因为它们相通的条件是存在某几条修好的公路将它们连接,于是时间就取决于这几条公路中最迟建好的那条,于是把时间看成权,任意取一个顶点,使用DJ算法,求得他到其他所有公路的最短瓶颈路(最短时间内两村庄通车),因为是无向图,所以A到B的最短路即为B到A的最短路。于是源与其他所有顶点最短路的最大值即为所求。
CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路的更多相关文章
- codevs 1817 灾后重建
/* 暴力暴力 离线每次添边 堆优化dij 70 SPFA 80..... */ #include<iostream> #include<cstdio> #include< ...
- 【洛谷P1119题解】灾后重建——(floyd)
这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在 ...
- P1119 灾后重建(floyd进阶)
思路:这道题看n的范围很小(n<=200),显然就用floyd可以解决的问题,但又并不是简单的floyd算法,还是需要一些小小的变化.一开始我的思路是先跑一次弗洛伊德最短路,这样子显然复杂度很高 ...
- [luoguP1119] 灾后重建(Floyd)
传送门 基于Floyd的动态规划原理,我们可以只用进行一次Floyd. 而题目给出的限制条件相当于给Floyd加了时间限制而已. 还是得靠对Floyd的理解. ——代码 #include <cs ...
- Luogu P1119 灾后重建 【floyd】By cellur925
题目传送门 这道题我们很容易想到对于每次询问,都跑一遍最短路(spfa,虽然他已经死了).只需在松弛的时候加入当前相关的点是否已经修好的判断,果不其然的TLE了4个点. (然鹅我第一次用spfa跑的时 ...
- 洛谷 P1119 灾后重建(Floyd)
嗯... 题目链接:https://www.luogu.org/problem/P1119 这道题是一个Floyd的很好的题目,在Floyd的基础上加一点优化: 中转点k在这里不能暴力枚举,否则会超时 ...
- 【Luogu】P1119灾后重建(Floyd)
题目链接 见题解: feilongz. 这里只放代码. #include<cstdio> #include<cstring> #include<cstdlib> # ...
- 洛谷 P1119 灾后重建 最短路+Floyd算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1119 灾后重建 题目描述 B地区在地震过后,所有村 ...
- [Luogu P1119] 灾后重建 (floyd)
题面 传送门:https://www.luogu.org/problemnew/show/P1119 Solution 这题的思想很巧妙. 首先,我们可以考虑一下最暴力的做法,对每个时刻的所有点都求一 ...
随机推荐
- 一般处理程序获取session值
1.要在一般处理程序中获取其他页面的session值,需要引用名空间: using System.Web.SessionState; 2.然后继承一个接口:IRequiresSessionState, ...
- Spring.Net的IOC入门
1.构造器注入 namespace Spring.Net { class Program { //构造器注入 static void Main(string[] args) { IApplicatio ...
- Java集合源码学习(五)几种常用集合类的比较
这篇笔记对几个常用的集合实现,从效率,线程安全和应用场景进行综合比较. >>ArrayList.LinkedList与Vector的对比 (1)相同和不同都实现了List接口,使用类似.V ...
- 终于看完<LEARNING SQL>第二版,立此存照
- 在iMac机os x上装win7双系统经验心得
首先,以上iMac的内存超过4GB,需要安装x64版的win7,可以用QQ旋风从这里下载(cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso) 下载 ...
- 1-03 Sql Sever 的身份验证模式
身份验证分为: 1:Windows身份验证. 1:Sql Sever身分验证. 每种验证的具体方式: 1Windows的验证方式 点击下拉框,有这两种验证方式,Windows验证只需要启动服务即可. ...
- VPS -Digital Ocean -初试以及VPN的搭建
首先恭喜你找到这篇博客,它会带你走出困境. 题外话(请忽略):一直以来想搞一个VPS,终于在自己的刺激下试了一下Digital Ocean,还没有使用很长时间不做太多评论,唯一给我的感觉是各种操作还算 ...
- Pushlet浏览器长连接通讯
原文链接:http://cuisuqiang.iteye.com/blog/1416771 Pushlet(一种comet 架构的实现)是基于Servlet 机制,数据从server端的Java 对象 ...
- Android加载大图片OOM异常解决
尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过 ...
- 【spring 后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中
问题: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...