POJ3114 Countries in War (强连通分量 + 缩点 + 最短路径 + 好题)
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <vector>
- using namespace std;
- const int Max = ;
- const int INF = 0x3f3f3f3f;
- int n, m, dfs_clock, scc_cnt, scnt;
- int g[Max][Max], pre[Max], low[Max], Stack[Max], sccno[Max];
- int G[Max][Max];
- int head[Max], num;
- struct Edge
- {
- int v, Next;
- };
- Edge edge[Max * Max];
- void addEdge(int u, int v)
- {
- edge[num].v = v;
- edge[num].Next = head[u];
- head[u] = num++;
- }
- void init()
- {
- memset(head, -, sizeof(head));
- memset(pre, , sizeof(pre));
- //memset(low, 0, sizeof(low));
- memset(sccno, , sizeof(sccno));
- scnt = dfs_clock = scc_cnt = num = ;
- for (int i = ; i <= n; i++)
- for (int j = i; j <= n; j++)
- {
- if (i == j)
- G[i][j] = g[i][j] = ;
- else
- {
- g[i][j] = g[j][i] = INF;
- G[i][j] = G[j][i] = INF;
- }
- }
- }
- void dfs(int u)
- {
- pre[u] = low[u] = ++dfs_clock;
- Stack[scnt++] = u;
- for (int i = head[u]; i != -; i = edge[i].Next)
- {
- int v = edge[i].v;
- if (!pre[v])
- {
- dfs(v);
- low[u] = min(low[u], low[v]);
- }
- else if (!sccno[v])
- low[u] = min(low[u], pre[v]);
- }
- if (low[u] == pre[u])
- {
- scc_cnt++;
- for (; ;)
- {
- int x = Stack[--scnt];
- sccno[x] = scc_cnt;
- if ( x == u)
- break;
- }
- }
- }
- void find_scc()
- {
- for (int i = ; i <= n; i++)
- {
- if (!pre[i])
- dfs(i);
- }
- }
- void build_new_graphic()
- {
- for (int i = ; i <= n; i++)
- {
- for (int j = ; j <= n; j++)
- {
- if (i != j && sccno[i] != sccno[j] && g[i][j] != INF) // 不同的连通分量号建立一条有向边。
- {
- G[ sccno[i] ][ sccno[j] ] = min(g[i][j], G[ sccno[i] ][ sccno[j] ]);
- }
- }
- }
- }
- int dist[Max], vis[Max];
- void dijkstra(int start, int goal)
- {
- //利用起点start,终点goal来搞,以前做惯了,直接用起点是1来做了
- for (int i = ; i <= scc_cnt; i++)
- dist[i] = G[start][i];
- memset(vis, , sizeof(vis));
- dist[start] = ;
- vis[start] = ;
- for (int i = ; i <= scc_cnt; i++)
- {
- int minn = INF, pos = ; // 这里初始化pos为1,否则当下面的循环不满足条件是,执行vis[pos]会出错
- for (int j = ; j <= scc_cnt; j++)
- {
- if (!vis[j] && minn > dist[j])
- {
- minn = dist[j];
- pos = j;
- }
- }
- vis[pos] = ;
- for (int j = ; j <= scc_cnt; j++)
- {
- if (!vis[j] && dist[j] > dist[pos] + G[pos][j])
- dist[j] = dist[pos] + G[pos][j];
- }
- }
- if (dist[goal] != INF)
- printf("%d\n", dist[goal]);
- else
- printf("Nao e possivel entregar a carta\n");
- }
- int main()
- {
- while (scanf("%d%d", &n, &m) != EOF)
- {
- if (n == && m == )
- break;
- init();
- int u, v, c;
- for (int i = ; i <= m; i++)
- {
- scanf("%d%d%d", &u, &v, &c);
- if (g[u][v] > c)
- {
- g[u][v] = c; // 判断重边
- }
- addEdge(u, v);
- }
- find_scc(); // 找强连通分量
- //cout << scc_cnt << endl;
- build_new_graphic(); // 重新构图
- int k;
- scanf("%d", &k);
- while (k--)
- {
- scanf("%d%d", &u, &v);
- if (sccno[u] == sccno[v]) // 同一连通分量直接输出
- printf("0\n");
- else
- {
- dijkstra(sccno[u], sccno[v]);
- }
- }
- printf("\n");
- }
- return ;
- }
POJ3114 Countries in War (强连通分量 + 缩点 + 最短路径 + 好题)的更多相关文章
- Countries in War(强连通分量及其缩点)
http://poj.org/problem?id=3114 题意:有n个城市,m条边,由a城市到b城市的通信时间为w,若a城市与b城市连通,b城市与a城市也连通,则a,b城市之间的通信时间为0,求出 ...
- POJ1236Network of Schools[强连通分量|缩点]
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16571 Accepted: 65 ...
- POJ1236Network of Schools(强连通分量 + 缩点)
题目链接Network of Schools 参考斌神博客 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后 ...
- HD2767Proving Equivalences(有向图强连通分量+缩点)
题目链接 题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的 分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG.接下来,设有a个节点(每个节点对应 ...
- UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)
题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...
- ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)
题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...
- POJ2553 The Bottom of a Graph(强连通分量+缩点)
题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v). 把图的强连通分量缩点,那么答案显然就是所有出度为0的点. 用Tarjan找强连通分量: #include<cstdio&g ...
- uva 11324 The Largest Clique(强连通分量缩点+DAG动态规划)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...
- poj 2762 Going from u to v or from v to u?(强连通分量+缩点重构图+拓扑排序)
http://poj.org/problem?id=2762 Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: ...
随机推荐
- 子Div使用Float后如何撑开父Div
如果想要撑开父元素可以采用以下方法: 方法一: 父元素设置overflow以及zoom,样式如下: 1 <style> 2 #div1{border:1px solid red;ove ...
- 新时代的coder如何成为专业程序员
在移动互联网"泛滥"的今天,越来越多非专业(这里的非专业指的是非计算机专业毕业的程序员)程序员加入到了IT行业中来了,可能是因为移动互联网的火爆导致程序员容易就业而且工资很高,可能 ...
- 用canvas 实现个图片三角化(LOW POLY)效果
之前无意中看到Ovilia 用threejs做了个LOW POLY,也就是图片平面三角化的效果,觉得很惊艳,然后就自己花了点时间尝试了一下. 我是没怎么用过threejs,所以就直接用canvas的2 ...
- KM模板
var n,m,i,j:longint; ans:int64; sel,lx,ly,slack:..] of int64; a:..,..] of int64; visx,visy:..] of bo ...
- Ryu
What's Ryu? Ryu is a component-based software defined networking framework. Ryu provides software co ...
- C语言printf()函数:格式化输出函数
C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为: int printf( char ...
- 第八章:Java集合
1.Java集合 A:对象的容器. B:实现数据结构(栈.队列) 2. Set:无序不重复 List: 有序可重复,长度可变. Map: 存放键值对. 3. Iterator foreach
- sublime package control 被墙的解决方法
在host里面配置 50.116.34.243 sublime.wbond.net 好用的插件地址 http://www.thinkphp.cn/topic/37057.html
- iOS开发小技巧--实现将图片保存到本地相册
一.报错的代码 错误 -- out of bounds 超出界限的意思 *** Terminating app due to uncaught exception 'NSInvalidArgument ...
- 【BZOJ 3529】【SDOI 2014】数表
看Yveh的题解,这道题卡了好长时间,一直不明白为什么要······算了当时太naive我现在都不好意思说了 #include<cstdio> #include<cstring> ...