Tarjian割点样例错了,求调
查看原帖
Tarjian割点样例错了,求调
735696
Mcqueen1210楼主2024/9/27 13:39

如题

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll M=2e4+5;
ll n,m,low[M],num[M],ans,dfn,root=1;
vector<ll>v[M];
struct node
{
	ll a1,a2;
}a[M];
bool cmp(node x,node y)
{
	return (x.a1==y.a1?x.a2<y.a2:x.a1<y.a1);
}
void dfs(ll k,ll fa)
{
	low[k]=num[k]=++dfn;
	for(int i=0;i<v[k].size();i++)
	{
		ll x=v[k][i];
		if(!num[x])
		{
			dfs(x,k);
			low[k]=min(low[k],low[x]);
			if(low[x]>num[k]&&k!=root)
			{
				a[++ans].a1=min(k,x);
				a[ans].a2=max(k,x);
			}
		}
		else if(num[x]<num[k]&&x!=fa)
		{
			low[k]=min(low[k],num[x]);
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		ll x,y;
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	for(int i=1;i<=n;i++)
	{
		if(!num[i])
		{
			root=i;
			dfs(i,i);
		}
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=ans;i++)
	{
		cout<<a[i].a1<<" "<<a[i].a2<<endl;
	}
	return 0;
}
2024/9/27 13:39
加载中...