[hdu 5521 Meeting] 拆边 + Dijkstra
来源:互联网 发布:房地产横盘 知乎 编辑:程序博客网 时间:2024/05/18 08:08
[hdu 5521 Meeting] 拆边 + Dijkstra
题目链接:[hdu 5521 Meeting] 拆点 + Dijkstra
题意描述:给定
解题思路:这个题目还是具有一定的技巧性的。考虑这个最短路问题,可能关键的问题是如何存边。我这里用到了拆边的技巧。也就是,对于每个集合
分别对顶点
#include <bits/stdc++.h>using namespace std;#define FIN freopen("input.txt", "r", stdin)typedef __int64 LL;const int MAXN = 1e6 + 5;const int MAXE = 1e6 + 5;const LL INF = 0x3f3f3f3f3f3f3f3fLL;int T, cas;int N, M;LL ans;set<int> res;set<int>::iterator iter;struct Edge { int v, next; LL w; Edge() {} Edge(int v, LL w, int next) : v(v), w(w), next(next) {}} edges[MAXE << 1];int head[MAXN], ESZ;LL dp[MAXN];void init() { ESZ = 0; memset(head, -1, sizeof(head)); res.clear();}void add_edge(int u, int v, LL w) { edges[ESZ] = Edge(v, w, head[u]); head[u] = ESZ ++;}struct Dijkstra { struct QNode { int u; LL cost; QNode() {} QNode(int u, LL cost) : u(u), cost(cost) {} bool operator > (const QNode& e)const { return cost > e.cost; } } cur; bool used[MAXN]; LL cost[MAXN]; priority_queue<QNode, vector<QNode>, greater<QNode> > Q; void init() { memset(used, false, sizeof(used)); memset(cost, 0x3f, sizeof(cost)); } void run(int src) { int u, v; LL w; Q.push(QNode(src, cost[src] = 0)); while(!Q.empty()) { cur = Q.top(); Q.pop(); u = cur.u; if(used[u]) continue; used[u] = true; for(int i = head[u]; ~i; i = edges[i].next) { v = edges[i].v, w = edges[i].w; if(!used[v] && cost[v] > cost[u] + w) { Q.push(QNode(v, cost[v] = cost[u] + w)); } } } }} dij1, dij2;int main() {#ifndef ONLINE_JUDGE FIN;#endif // ONLINE_JUDGE int n, u, v; LL w; cas = 0; scanf("%d", &T); while(T --) { init(); scanf("%d %d", &N, &M); u = N; for(int i = 0; i < M; i++) { scanf("%I64d %d", &w, &n); u ++; while(n --) { scanf("%d", &v); add_edge(u, v, w); add_edge(v, u, w); } } dij1.init(); dij1.run(1); if(dij1.cost[N] == INF) { printf("Case #%d: Evil John\n", ++cas); continue; } for(u = 1; u <= N; u++) { dp[u] = dij1.cost[u] >> 1; } dij2.init(); dij2.run(N); for(u = 1; u <= N; u++) { dp[u] = max(dp[u], dij2.cost[u] >> 1); } ans = INF; for(u = 1; u <= N; u++) { ans = min(ans, dp[u]); } printf("Case #%d: %I64d\n", ++cas, ans); for(u = 1; u <= N; u++) { if(ans != dp[u]) continue; if(dp[u] == (dij1.cost[u] >> 1) || dp[u] == (dij2.cost[u] >> 1)) { res.insert(u); } } for(iter = res.begin(); iter != res.end(); iter++) { if(iter != res.begin()) printf(" "); printf("%d", *iter); } printf("\n"); } return 0;}
1 0
- [hdu 5521 Meeting] 拆边 + Dijkstra
- HDU-5521 Meeting(Dijkstra)
- HDU 5521 Meeting ( nlogn的dijkstra+拆点)
- HDU 5521 Meeting
- HDU 5521Meeting
- HDU 5521 Meeting
- hdu 5521 Meeting
- hdu 5521 Meeting(优先队列+dijkstra)(建图思想)
- hdoj 5521 Meeting 【优先队列 dijkstra】
- HDU 5521-Meeting(最短路)
- HDU 5521 Meeting 最短路
- HDU 5521 Meeting【最短路】
- HDU 5521 Meeting(最短路)
- HDU 5521 Meeting(最短路)
- 【最短路】hdu 5521 Meeting
- Meeting HDU
- Meeting HDU
- HDU-5510 Bazinga、HDU-5521 Meeting
- JVM之锁的优化
- AppCompatActivity的View树
- 渗透测试笔记:Windows权限提升
- JVM之内存中的对象模型
- 基础总结篇之二:Activity的四种launchMode
- [hdu 5521 Meeting] 拆边 + Dijkstra
- tomcat报错org.springframework.web.context.ContextLoaderListener找不到
- 找出整数数组中两两相加等于key的整数对
- 火车站调度问题
- 【超强教程】python在64位操作系统下的安装
- 利用Nginx模拟搭建服务器集群
- 带HeaderView和FooterView的自定义RecyclerView.Adapter
- 下载android环境
- 《R语言实战》读后感