poj 2117(tarjan 求无向图去掉一点的连通分量)
2012-07-04 14:00
295 查看
题意:在一片森林中求去掉一节点之后形成最多的连通分量的个数。注意是森林就可以了。 #include<iostream> #include<cstdio> #include<cstring> #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; const int nMax=10005; const int mMax=1000005; class edge{ public: int v,nex; };edge e[mMax]; int k,head[mMax];//head[i]是以点i为起点的链表头部 void addedge(int a,int b){//向图中加边的算法,注意加上的是有向边//b为a的后续节点既是a---->b e[k].v=b; e[k].nex=head[a]; head[a]=k;k++; } int rot,rt_son,dep; int dfn[nMax];//记录节点访问的深度 int low[nMax];//记录该节点能访问的最小的递归深度 int cut[nMax];//为去掉该节点之后形成的连通分量 void Tarjan(int u){ cout<<u<<"F"<<endl; cout<<endl; dfn[u]=low[u]=dep; for(int i = head[u]; i ; i=e[i].nex) { int v = e[i].v; if(!dfn[v]) { dep++; Tarjan(v); if(u==rot)//回到了开始访问的节点 rt_son++;//cout<<"cut["<<rot<<"]++ "<<rt_son<<endl ; else { low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]) { cut[u]++; //这个地方稍稍修改 //cout<<"cut["<<u<<"]++"<<' '<<cut[u]<<endl; } } } else { low[u]=min(low[u],dfn[v]); cout<<"low["<<u<<"] "<<low[u]<<endl;; } } } int main(){ int n, m, u, v, i, sum, MaxCut; while(scanf("%d%d", &n, &m)&&!(!m&&!n)) { if(!m) { printf("%d\n",n-1);continue; } memset(head,0,sizeof(head)); memset(cut,0,sizeof(cut)); memset(dfn,0,sizeof(dfn)); k=1; while(m--) { scanf("%d%d",&u,&v); addedge(v,u); addedge(u,v); } sum=MaxCut=0; dep=1; for(i=0;i<n;i++) { if(!dfn[i]) { rot=i,rt_son=0; Tarjan(rot); cut[rot]=rt_son-1; sum++;//记录森林中数的个数 } MaxCut=max(MaxCut,cut[i]); } // for(int i=0;i<n;i++)、如果要求去掉该节点之后的连通分量,必须加1 // cout<<cut[i]+1<<' '; // cout<<endl; printf("%d\n",sum+MaxCut); } return 0; }
相关文章推荐
- poj 2117 Electricity 求无向图中去掉一个点后最大的联通分支数 无向图有可能不联通 tarjan求割点模板
- poj 2117 Electricity 【无向图求割点】【求去掉一个点后 图中最多的BCC数目】
- POJ 2117(去掉割点剩下的图中最大连通块)
- poj 2117 Electricity(Tarjan求割点)
- POJ 2117 Electricity (无向图求割点)
- POJ 3710 Christmas Game 无向图删边 经典的删边游戏 Tarjan缩点
- POJ 3177--Redundant Paths【无向图增加最少的边成为边双连通图 && tarjan求ebc && 缩点构造缩点树】
- POJ 1144 Network 无向图求割点Tarjan
- POJ 2117 Electricity(割点求连通分量)
- POJ-2117 Electricity (割点[Tarjan])
- poj 2117 去掉割点可以分得的联通图的个数模板
- POJ 2117 (割点+连通分量)
- POJ 3177--Redundant Paths【无向图添加最少的边成为边双连通图 && tarjan求ebc && 缩点构造缩点树】
- poj 2117 去掉割点可以分得的联通图的个数模板
- POJ 2117 Electricity (tarjan)删割点后求块数
- POJ 2117 Electricity(无向图割点)
- poj 3177 & 3352 【无向图双连通分量Tarjan】
- POJ 1523 SPF(Tarjan 求解连通分量)
- poj 3177 Redundant Paths 【无向图增加最少的边是图成为边—双连通】【tarjan求EBC + 缩点 统计度数为1的EBC】
- POJ 2117 Electricity(无向图割点)