AC日记——灾后重建 洛谷 P1119
2017-04-22 16:41
330 查看
灾后重建
思路:
看到n<=200,思考弗洛伊德算法;
如何floyed呢?
floyed是一种动态规划求最短路的算法;
它通过枚举中间点来更新两点之间最短路;
回到这个题本身;
所有点的重建完成的时间和询问的时间都已经排好序了;
所以,我们把floyed拆开;
对于一个三维的k,i,j的floyed算法;
我们判断当前的询问在哪两个相邻的k之间;
然后,我们判断当时的连通性以及最短路情况;
来,上代码:
思路:
看到n<=200,思考弗洛伊德算法;
如何floyed呢?
floyed是一种动态规划求最短路的算法;
它通过枚举中间点来更新两点之间最短路;
回到这个题本身;
所有点的重建完成的时间和询问的时间都已经排好序了;
所以,我们把floyed拆开;
对于一个三维的k,i,j的floyed算法;
我们判断当前的询问在哪两个相邻的k之间;
然后,我们判断当时的连通性以及最短路情况;
来,上代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define INF 0x7ffffff int n,m,f[205][205][205],ti[205]; inline void in(int &now) { char Cget=getchar();now=0; while(Cget>'9'||Cget<'0') Cget=getchar(); while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; Cget=getchar(); } } int main() { in(n),in(m); for(int k=0;k<=n+2;k++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) f[k][i][j]=INF; } } for(int i=0;i<n;i++) in(ti[i]); int u,v,w; for(int i=1;i<=m;i++) { in(u),in(v),in(w); f[0][u][v]=w; f[0][v][u]=w; } for(int k=1;k<=n;k++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k-1]+f[k-1][k-1][j]); } } } in(m);int tot=1; for(int i=1;i<=m;i++) { in(u),in(v),in(w); if(ti[u]>w||ti[v]>w) { printf("-1\n"); continue; } while(ti[tot]<=w&&tot<n) tot++; int now=tot-1; if(ti[now]<=w) { if(f[tot][u][v]==INF) printf("-1\n"); else printf("%d\n",f[tot][u][v]); } else printf("-1\n"); } return 0; }
相关文章推荐
- AC日记——集合位置 洛谷 P1491
- AC日记——国王游戏 洛谷 P1080
- AC日记——神奇的幻方 洛谷 P2615(大模拟)
- AC日记——信息传递 洛谷 P2661 (tarjan求环)
- AC日记——独木桥 洛谷 p1007
- AC日记——校门外的树 洛谷 P1047
- 洛谷 P1119 灾后重建
- AC日记——最小路径覆盖问题 洛谷 P2764
- AC日记——栈 洛谷 P1044
- AC日记——队列安排 洛谷 P1160
- AC日记——餐巾计划问题 洛谷 P1084
- AC日记——[SDOI2011]消耗战 洛谷 P2495
- AC日记——潜伏者 洛谷 P1071 (模拟)
- AC日记——中位数 洛谷 P1168
- AC日记——【模板】KMP字符串匹配 洛谷 3375
- AC日记——[USACO15DEC]最大流Max Flow 洛谷 P3128
- AC日记——[USACO09JAN]全流Total Flow 洛谷 P2936
- AC日记——方差 洛谷 P1471
- AC日记——红色的幻想乡 洛谷 P3801
- AC日记——欧几里得的游戏 洛谷 P1290