CodeForces 732F Tourist Reform
2016-10-19 21:42
295 查看
题意:
给一个无向无重边无自环的连通图,问:如果把每条边确定一个方向(变成有向图),那么在这个图中,所有点能到达的点的个数中的最小值最大是多少。分析:
最终的图缩点以后就是一个拓扑结构,那么一定有一个点是只能到达他本身,如果这个点是一个强连通块的话,答案就是这个强连通块内节点的个数。那么找一个强连通块内部节点个数最大的强连通块,然后dfs建图。ps:其实就是一个找无向图双联通块的过程。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <string> #include <map> #include <vector> #include <set> #include <queue> #include <stack> #include <algorithm> using namespace std; typedef long long LL; typedef pair <int, int> PII; typedef vector <int> VI; #define FOR(i, x, y) for(int i = x; i < y; ++ i) #define IFOR(i, x, y) for(int i = x; i > y; -- i) #define pb push_back #define mp make_pair #define fi first #define se second #define lrt rt<<1 #define rrt rt<<1|1 #define lson rt<<1, l, mid #define rson rt<<1|1, mid+1, r LL quickpow(LL a, LL n, LL mod) { LL res = 1; while(n) { if(n&1) res = res*a%mod; a = a*a%mod; n >>= 1; } return res; } const int maxn = 400005; const int inf = 0x3fffffff; int n, m; int dfn[maxn], low[maxn], tot; int head[maxn], e_cnt; void init() { FOR(i, 1, n+1) head[i] = -1; FOR(i, 1, n+1) dfn[i] = low[i] = 0; e_cnt = 0; } struct Edge{ int v, w; int nt; Edge() {} Edge(int vv, int ww, int nn) : v(vv), w(ww), nt(nn) {} }e[maxn<<1]; PII mat[maxn]; void addedge(int u, int v, int w) { e[e_cnt] = Edge(v, w, head[u]); head[u] = e_cnt++; } int s[maxn], ans, rt; void dfs(int u, int fa) { low[u] = dfn[u] = ++ tot; s[++s[0]] = u; for(int i = head[u]; i != -1; i = e[i].nt) { int v = e[i].v; if(v == fa) continue; if(!dfn[v]) { mat[e[i].w] = mp(v, u); dfs(v, u); low[u] = min(low[u], low[v]); } else { mat[e[i].w] = mp(u, v); low[u] = min(low[u], dfn[v]); } } if(dfn[u] == low[u]) { int res = 1; while(s[s[0]] != u) { ++ res; -- s[0]; } -- s[0]; if(ans < res) {ans = res; rt = u;} } } int main() { while(~scanf("%d%d", &n, &m)) { int u, v; init(); FOR(i, 0, m) { scanf("%d%d", &u, &v); addedge(u, v, i); addedge(v, u, i); } s[0] = 0; tot = 0; ans = 1; dfs(1, -1); memset(dfn, 0, sizeof(dfn)); s[0] = 0; tot = 0; ans = 1; dfs(rt, -1); printf("%d\n", ans); FOR(i, 0, m) printf("%d %d\n", mat[i].fi, mat[i].se); } return 0; }
相关文章推荐
- CodeForces 24C Sequence of points (几何)
- Codeforces 347C Alice and Bob
- CodeForces 591B
- Codeforces 347C - Alice and Bob
- CodeForces - 622E dfs+贪心
- [CodeForces-721E]Road to Home
- CodeForces 245D Restoring Table
- Codeforces 460C Present (贪心 + 二分)
- 【CodeForces】[621A]Wet Shark and Odd and Even
- 【CodeForces】444A - DZY Loves Physics(图论规律)
- [线段树] Codeforces 794F Round #414 F. Leha and security system
- Codeforces 284E Coin Troubles【思维+拓扑排序+完全背包】好题!
- CodeForces 401C
- codeforces 414B B. Mashmokh and ACM(dp)
- codeforces 354 div2 C Vasya and String 前缀和
- CodeForces 732B Cormen — The Best Friend Of a Man
- Codeforces 104C Cthulhu dfs暴力 || 点双连通缩点
- CodeForces 867A Between the Offices
- Codeforces 413C Jeopardy!(贪心)
- CodeForces 425E Sereja and Sets