HDU 3836 — Equivalent Sets
2015-05-01 23:10
387 查看
原题:http://acm.hdu.edu.cn/showproblem.php?pid=3836
题意:给出一个有向图,问最少加几条边使得该图强连通;
思路:先求出所有的强连通分量,计算新图中入度 = 0的点和出度 = 0的点,两者的最大值即为答案;
题意:给出一个有向图,问最少加几条边使得该图强连通;
思路:先求出所有的强连通分量,计算新图中入度 = 0的点和出度 = 0的点,两者的最大值即为答案;
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int N = 20005; const int M = 50005; int head ; int DFN , low , stack ; int vis ; int taj, edgenum, top, time; int belong ; int n, m; int out , in ; struct node { int from, to, nex; }edge[M]; void add(int u, int v) { edge[edgenum].from = u; edge[edgenum].to = v; edge[edgenum].nex = head[u]; head[u] = edgenum++; } void tarjan(int u) { DFN[u] = low[u] = time++; vis[u] = 1; stack[top++] = u; for(int i = head[u];i!=-1;i = edge[i].nex) { int v = edge[i].to; if(DFN[v] == -1) { tarjan(v); low[u] = min(low[u], low[v]); } else if(vis[v]) low[u] = min(low[u], DFN[v]); } if(DFN[u] == low[u]) { taj++; while(1) { int now = stack[--top]; vis[now] = 0; belong[now] = taj; if(now == u) break; } } } void init() { memset(head, -1, sizeof(head)); memset(DFN, -1, sizeof(DFN)); memset(low, -1, sizeof(low)); memset(vis, 0, sizeof(vis)); top = 0, taj = 0, time = 0; edgenum = 0; } int main() { while(scanf("%d%d", &n, &m)!=EOF) { init(); for(int i = 1;i<=m;i++) { int u, v; scanf("%d%d", &u, &v); add(u, v); } for(int i = 1;i<=n;i++) { if(DFN[i] == -1) tarjan(i); } if(taj == 1 || n<1) { printf("0\n"); continue; } memset(out, 0, sizeof(out)); memset(in, 0, sizeof(in)); for(int i = 0;i<edgenum;i++) { int u = edge[i].from; int v = edge[i].to; if(belong[u]!=belong[v]) { out[belong[u]]++; in[belong[v]]++; } } int ans1 = 0, ans2 = 0; for(int i = 1;i<=taj;i++) { if(in[i] == 0) ans1++; if(out[i] == 0) ans2++; } printf("%d\n", max(ans1, ans2)); } return 0; }
相关文章推荐
- HDU 3836 Equivalent Sets【Tarjan染色+搭桥】
- HDU 3836 Equivalent Sets
- hdu 3836 Equivalent Sets(强连通分量--加边)
- hdu 3836 Equivalent Sets【强连通Kosaraju+缩点染色】
- [tarjan] hdu 3836 Equivalent Sets
- HDU 3836 Equivalent Sets(强连通分量)
- HDU 3836 Equivalent Sets(Tarjan+缩点)
- hdu 3836 Equivalent Sets (tarjan缩点)
- [图论] hdu 3836 Equivalent Sets
- hdu 3836 Equivalent Sets 强联通 tarjan缩点
- HDU 3836 Equivalent Sets【强连通分量】
- hdu 3836 Equivalent Sets(SCC,Kosaraju算法)
- HDOJ/HDU 3836 Equivalent Sets
- hdu 3836 Equivalent Sets(tarjan+缩点)
- hdu 3836 Equivalent Sets
- hdu 3836 Equivalent Sets(强连通,tarjan,4级)
- [tarjan] hdu 3836 Equivalent Sets
- HDU 3836 Equivalent Sets
- HDU 3836 Equivalent Sets(tarjan + 压缩强连通)
- hdu 3836 Equivalent Sets(强连通,tarjan,4级)