HDU4460(最短路)
2015-10-11 21:24
501 查看
题意很简单,求所有两点间最短路的最大值。
暴力n次spfa。
暴力n次spfa。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <map> #include <vector> #include <queue> using namespace std; #define maxn 1111 #define maxm 21111 #define INF 111111111 struct node { int v, w; node (int v = 0, int w = 0) : v(v), w(w) {} }; vector <node> edge[maxn]; int n, cnt[maxn]; bool vis[maxn]; string name, name2; map <string, int> gg; int ans, cur; int d[maxn]; int fa[maxn]; int find (int x) { return fa[x] == x ? fa[x] : fa[x] = find (fa[x]); } void add_edge (int from, int to, int w) { edge[from].push_back (node (to, w)); } bool spfa (int start) { memset (vis, 0, sizeof vis); for (int i = 1; i <= n; i++) d[i] = INF; vis[start] = 1; d[start] = 0; queue <int> que; while (!que.empty ()) que.pop (); memset (cnt, 0, sizeof cnt); cnt[start] = 1; que.push (start); while (!que.empty ()) { int u = que.front (); que.pop (); vis[u] = 0; for (int i = 0; i < edge[u].size (); i++) { int v = edge[u][i].v; if (d[v] > d[u]+edge[u][i].w) { d[v] = d[u]+edge[u][i].w; if (!vis[v]) { vis[v] = 1; que.push (v); if (++cnt[v] > n) return 0; } } } } cur = 0; for (int i = 1; i <= n; i++) { cur = max (cur, d[i]); } ans = max (cur, ans); return 1; } int main () { //freopen ("in", "r", stdin); while (scanf ("%d", &n) == 1 && n) { gg.clear (); for (int i = 1; i <= n; i++) fa[i] = i, edge[i].clear (); for (int i = 1; i <= n; i++) { cin >> name; gg[name] = i; } int q; scanf ("%d", &q); while (q--) { cin >> name >> name2; int u = gg[name], v = gg[name2]; add_edge (u, v, 1); add_edge (v, u, 1); int p1 = find (u), p2 = find (v); if (p1 != p2) { fa[p1] = p2; } } int kk = find (1); for (int i = 2; i <= n; i++) { if (find (i) != kk) { printf ("-1\n"); goto out; } } ans = 0; for (int i = 1; i <= n; i++) spfa (i); printf ("%d\n", ans); out: ; } return 0; }
相关文章推荐
- java.lang.SecurityException: Need BLUETOOTH ADMIN permission: Neither user 10047 nor current process
- 【Python之旅】第六篇(四):Python多线程锁
- 【Python之旅】第六篇(四):Python多线程锁
- c/c++ 引用计数
- Scala——总计架构目录
- The Importance of Algorithms
- 用widthStep的方法来增加某范围的像素----与imageROI对比
- onItemLongClick事件的监听
- 正则表达式(转载)
- LeetCode OJ:Multiply Strings (字符串乘法)
- 程序化交易生态图谱2015年7月版
- 连载《一个程序猿的生命周期》- 37、《从0到1》中提到的4点创业信条! 【含】李彦宏的《开讲啦》
- 列出display的值,并说明它们的作用
- 文件I/O实践(1) --基础API
- word2013中表格文档最后空白页删不掉的问题
- 适配iOS9https请求
- 欢迎使用CSDN-markdown编辑器
- Bootstrat(一)
- The martian 2015 火星救援百度网盘下载真正可用的。2015-10-11更新
- Spring in Action 学习笔记一