割点与桥
#include"iostream"
#include"algorithm"
#include"vector"
using namespace std;
const int v=1000;
int edge[v][v];
int bridge[v][v],cut[v];
int low[v],dfn[v],vis[v];
void cut_bridge(int cur,int father,int dep,int n)
{
	vis[cur]=1;
	dfn[cur]=low[cur]=dep;
	int children=0;
	for(int i=0;i<n;i++)
		if(edge[cur][i])
		{
			if(i!=father&&vis[i]==1)
			{
				if(dfn[i]<low[cur])
					low[cur]=dfn[i];
			}
			if(vis[i]==0)
			{
				cut_bridge(i,cur,dep+1,n);
				children++;
				if(low[i]<low[cur]) low[cur]=low[i];
				if((father==-1&&children>1)||(father!=-1&&low[i]>=dfn[cur]))
					cut[cur]=true;
				if(low[i]>dfn[cur])
				{
					bridge[cur][i]=bridge[i][cur]=true;
				}
			}
		}
		vis[cur]=2;
}
int main()
{
    freopen("a.txt","r",stdin);
	int n,m;
	while(cin>>n>>m)
	{
		memset(edge,0,sizeof(edge));
		memset(vis,0,sizeof(vis));
		memset(bridge,0,sizeof(bridge));
		memset(cut,0,sizeof(cut));
		memset(dfn,0,sizeof(dfn));
		memset(low,0,sizeof(low));
		for(int i=0;i<m;i++)
		{
			int s,t;
			cin>>s>>t;
			edge[s][t]=edge[t][s]=1;
		}
		cut_bridge(0,-1,0,n);
		cout<<"bridge:\n";
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				if(bridge[i][j])
					cout<<i<<" "<<j<<endl;
		cout<<"cut:\n";
		for(int i=0;i<n;i++)
			if(cut[i]==1)
				cout<<i<<endl;
	}
	return 0;
}
/*
               0
			  /  \
			 1    2
			/ \  / \
		   3   4 5  6
*/

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32454729/article/details/51548844
个人分类: 模板
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

割点与桥

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭