poj 1236 (强连通)
2017-04-10 19:33
330 查看
#include<cstdio> #include<cstring> #define MAX_N 110 #define MAX(x,y) ((x)>(y)?(x):(y)) using namespace std; int map[MAX_N][MAX_N],rmap[MAX_N][MAX_N],vis[MAX_N],stack[MAX_N],cmp[MAX_N]; int tot=0,n; void dfs(int i) { vis[i]=1; for(int j=1;j<=n;j++) { if(!vis[j]&&map[i][j]) dfs(j); } stack[tot++]=i; } void rdfs(int i,int k) { vis[i]=1; cmp[i]=k; for(int j=1;j<=n;j++) { if(!vis[j]&&rmap[i][j]) rdfs(j,k); } } int scc() { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { if(!vis[i]) dfs(i); } int k=1; memset(vis,0,sizeof(vis)); for(int i=tot-1;i>=0;i--) { if(!vis[stack[i]]) { vis[stack[i]]=1; rdfs(stack[i],k++); } } return k; } int main() { int j,k,in[MAX_N],out[MAX_N]; scanf("%d",&n); for(int i=1;i<=n;i++) { while(~scanf("%d",&j)&&j) { map[i][j]=1; rmap[j][i]=1; } } k=scc(); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)) ; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(map[i][j]&&cmp[i]!=cmp[j]) { in[cmp[j]]++; out[cmp[i]]++; } } } int t1=0,t2=0; for(int i=1;i<k;i++) { if(!in[i]) t1++; if(!out[i]) t2++; } if(k==2) printf("1\n0\n"); else printf("%d\n%d\n",t1,MAX(t1,t2)); }
相关文章推荐
- poj-1236 强连通
- POJ-1236 Network of Schools 强连通+缩点
- 【个人专题一】强连通——Poj_1236
- poj 1236 Network of Schools(强连通、缩点、出入度)
- poj 1236 Network of Schools【强连通求孤立强连通分支个数&&最少加多少条边使其成为强连通图】
- POJ 1236 学校网络间的强连通
- POJ -- 1236 Network of Schools(强连通)
- POJ-1236(有向图强连通分量 + 缩点 + 加边使得整个图强连通)
- NYOJ-120 校园网络 &&POJ 1236 (强连通缩点targan算法)
- POJ 1236 Network of Schools(强连通 + 想法)- from lanshui_Yang
- poj 1236 Network of Schools 强连通
- poj-1236 Network Of Schools【强连通缩点】
- poj 1236 Network of Schools 【SCC + 缩点】【最少连接几个点可以直接或间接连接所有点 + 增加最少的边使图强连通】
- poj1236强连通缩点
- POJ 1236 Network of Schools(强连通缩点)
- poj1236强连通缩点
- poj1236——网络学校(强连通)
- 图论强连通专题:POJ1236
- poj3114 强连通+最短路
- poj 2762 强连通