ZOJ3080 ChiBi (最短路)
2015-08-15 22:03
351 查看
传送门
大意:有N艘船,有一些通过铁索连在一起,每条铁索都有一个长度,现在可以派遣一些士兵去点燃一些船,火会在相连的船之间传播,传播速度是1m/s.每个士兵只能点燃一艘船。现在你知道每条铁索的长度,以及从你的大本营派兵到每条船所需的时间。由于点燃船是一件很危险的事,所以要在派遣最少数量的士兵的条件下(就是每一个连通块派一个士兵),使得所有船被点燃的时间最早
思路:先求出每一个连通块,在每一个连通块中尝试每一条船作为起点,跑最短路,然后求出最远距离的最小值的最大值就好了(有点绕啊……)
代码:
大意:有N艘船,有一些通过铁索连在一起,每条铁索都有一个长度,现在可以派遣一些士兵去点燃一些船,火会在相连的船之间传播,传播速度是1m/s.每个士兵只能点燃一艘船。现在你知道每条铁索的长度,以及从你的大本营派兵到每条船所需的时间。由于点燃船是一件很危险的事,所以要在派遣最少数量的士兵的条件下(就是每一个连通块派一个士兵),使得所有船被点燃的时间最早
思路:先求出每一个连通块,在每一个连通块中尝试每一条船作为起点,跑最短路,然后求出最远距离的最小值的最大值就好了(有点绕啊……)
代码:
#include<cstdio> #include<cstring> #include<queue> using namespace std; int n, block[1005], dis[1005], color, d[1005]; struct node { int v, w; node *next; }Edge[1000*2000 + 5], *Adj[1005], *Mcnt; bool inq[1005]; int q[1005]; void Addedge(int u,int v,int w) { node *t = ++Mcnt; t->v = v; t->w = w; t->next = Adj[u]; Adj[u] = t; } int SPFA(int U) { memset(dis, 0x7f, sizeof dis); memset(inq, 0, sizeof inq); dis[U] = 0; inq[U] = 1; queue<int> q; q.push(U); int u, v, ans = -0x7f7f7f7f; while(!q.empty()) { u = q.front(); q.pop(); inq[u] = 0; for(node *p = Adj[u]; p; p = p->next) { v = p->v; if(p->w + dis[u] < dis[v]) { dis[v] = dis[u] + p->w; if(!inq[v]) {q.push(v); inq[v] = 1;} } } } for(int i = 1; i <= n; i ++) if(dis[i] != 0x7f7f7f7f) ans = max(dis[i], ans); return ans + d[U]; //加上到这个点的距离 } void dye(int u) // 染色求连通块 { block[u] = color; for(node *p = Adj[u]; p; p = p->next) if(!block[p->v]) dye(p->v); } int dist[1005]; int main() { while(~scanf("%d", &n)) { color = 0; Mcnt = Edge; memset(block, 0, sizeof block); memset(dist, 0x7f, sizeof dist); memset(Adj, 0, sizeof Adj); int mp; for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++){ scanf("%d", &mp); if(mp != -1 && i != j) Addedge(i, j, mp); } for(int i = 1; i <= n; i ++) scanf("%d", d + i); for(int i = 1; i <= n; i ++) if(!block[i]) {++ color; dye(i);} for(int i = 1; i <= n; i ++) { int p = SPFA(i); dist[block[i]] = min(p, dist[block[i]]); } int ans = 0; for(int i = 1; i <= color; i ++) ans = max(dist[i], ans); printf("%d\n", ans); } return 0; }
相关文章推荐
- HDU 1978 How many ways
- 单文档、多文档浅析
- Linux 线程同步(一)
- ZOJ3080 ChiBi (最短路)
- 【CCF系列】有趣的数
- HTML常用标签和属性
- 使用rundll32.exe运行dll函数
- Markdown使用方法
- Minimum Depth of Binary Tree
- HIbernate关系映射--单向一对多@OneToMany
- The Tree |
- PAT 1080. Graduate Admission (30)
- facl:文件访问控制列表
- myeclipse 查找文件(open type)快捷键
- VS2012的丑态
- HDU 1164 Eddy's research I
- M行N列数组转置
- 苏芯工作心得第一天
- ISP图像质量自动化测试方法
- 一道简单的几何变换