poj-1236 强连通
2012-09-26 17:03
204 查看
/*poj 1236 题意:有一个有向图,现在在任意多个节点上发送数据,问使所有节点都能收到数据,需要向多少个节点发送数据 仍然是这个有向图,问至少需要添加多少条边才能使得在任意节点发送数据所有节点都能收到数据。 思路:很明显这道题是强连通方面的题目,在强连通中缩点之后的节点的出度和入度都十分重要。 我们现在来考虑出度和入度和这道题目的答案有什么关系。 入度:如果有一个节点有入度那我们传送数据的时候肯定可以选择指向它的那个节点。所以显然入度为0的点就是第一问的答案 出度:明显第二问的题意就是问要添加多少条边能够使得整张图变为强连通的图,那么如果一张图中有出度为0的点那么肯定就是 不合题意的,所以要消灭所有出度为0的点,那么入度为0的点也的确会影响整张图能否构成一个强连通,所以入度为0的点也肯定 要去除,一条边能够消灭一个出度为0和入度为0的点,那么第二问的答案也就是求两个中间的最大值了。。 */ #include <iostream> using namespace std; #define MAXM 10010 #define MAXV 110 #define min(a,b) (a>b?b:a) typedef struct{ int s,t,next,next2; }Edge; Edge edge[MAXM]; int n,m,headlist[MAXV],headlist2[MAXV]; int order[MAXV],belong[MAXV]; int num,count; bool vis[MAXV]; void dfs(int x){ int i,a; vis[x]=1; for(i=headlist[x];i!=-1;i=edge[i].next){ a=edge[i].t; if(!vis[a]) dfs(a); } order[++num]=x; } void dfst(int x){ int i,a; belong[x]=count; //记录结点属于哪个连通分量,count从1开始记录 vis[x]=1; for(i=headlist2[x];i!=-1;i=edge[i].next2){ //要将边反过来遍历一遍 a=edge[i].s; if(!vis[a]) dfst(a); } } void kosaraju(){ int i; memset(vis,0,sizeof(vis)); num=count=0; for(i=1;i<=n;i++) if(!vis[i]) dfs(i); memset(vis,0,sizeof(vis)); for(i=n;i>=1;i--) if(!vis[order[i]]){ count++; dfst(order[i]); } } int in[MAXV]; int out[MAXV]; void solve() { int i,j,k; int ans1=0; int ans2=0; int temp; memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); if(count==1){ printf("1\n"); printf("0\n"); } else{ for(i=1;i<=n;i++){ for(j=headlist[i];j!=-1;j=edge[j].next) if(belong[i]!=belong[edge[j].t]) { out[belong[i]]++; in[belong[edge[j].t]]++; } } for(i=1;i<=count;i++) { if(in[i]==0) ans1++; if(out[i]==0) ans2++; } printf("%d\n",ans1); if(ans2>ans1) ans1=ans2; printf("%d\n",ans1); } } int main() { int i,j; int m; while(scanf("%d",&n)!=EOF) { memset(headlist,-1,sizeof(headlist)); memset(headlist2,-1,sizeof(headlist2)); m=0; for(i=1;i<=n;i++) { while(1) { scanf("%d",&j); if(j==0) break; edge[m].s=i; edge[m].t=j; edge[m].next=headlist[i]; headlist[i]=m; edge[m].next2=headlist2[j]; headlist2[j]=m; m++; } } kosaraju(); solve(); } return 0; }
相关文章推荐
- NYOJ-120 校园网络 &&POJ 1236 (强连通缩点targan算法)
- POJ 1236 学校网络间的强连通
- POJ-1236(有向图强连通分量 + 缩点 + 加边使得整个图强连通)
- poj 1236 Network of Schools 【SCC + 缩点】【最少连接几个点可以直接或间接连接所有点 + 增加最少的边使图强连通】
- POJ 1236 Network of Schools(强连通缩点)
- poj 1236 (强连通)
- POJ 1236 Network of Schools(强连通 + 想法)- from lanshui_Yang
- 【个人专题一】强连通——Poj_1236
- 图论强连通专题:POJ1236
- poj 1236 Network of Schools【强连通求孤立强连通分支个数&&最少加多少条边使其成为强连通图】
- poj 1236 Network of Schools 强连通
- POJ-1236 Network of Schools 强连通+缩点
- poj1236强连通缩点
- POJ -- 1236 Network of Schools(强连通)
- poj1236强连通缩点
- poj 1236 Network of Schools(强连通、缩点、出入度)
- poj1236——网络学校(强连通)
- poj-1236 Network Of Schools【强连通缩点】
- 【个人专题一】强连通——Poj_2186
- 【POJ】3114 Countries in War 强连通+最短路