萌新刚学欧拉路径模板题样例过不了求条
查看原帖
萌新刚学欧拉路径模板题样例过不了求条
398152
MinimumSpanningTree最小生成树楼主2024/10/24 13:41

一开始是 T 了最后一个点,然后加上了当前弧优化,现在样例都过不了了。求助

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e5+100,M=2e5+100;
int n,m,k,t[N],d1[N],d2[N],st,cnt1,cnt2,s[N],sk;
bool flag[M]; 
struct edge
{
	int u,v;
}e[M];
struct node
{
	int id,last;
}a[M];
bool cmp(edge a1,edge a2)
{
	return a1.v>a2.v;
}
void add(int a1,int a2)
{
	a[++k].id=a2;
	a[k].last=t[a1];
	t[a1]=k;
}
void dfs(int x)
{
	//printf("%d ",x);
	for(int i=t[x];i;i=a[i].last)
	{
		t[x]=a[i].last;
		dfs(a[i].id);
	}
	s[++sk]=x;
} 
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++) 
	{
		scanf("%d%d",&e[i].u,&e[i].v);
		d1[e[i].v]++,d2[e[i].u]++;
	}
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=m;i++) add(e[i].u,e[i].v);
	for(int i=1;i<=n;i++)
	{
		if(d1[i]==d2[i]) continue;
		if(d2[i]-d1[i]==1) cnt1++,st=i;
		else if(d1[i]-d2[i]==1) cnt2++;
		else 
		{
			printf("No");
			return 0;
		}
	}
	if(!(!cnt1&&!cnt2||cnt1==1&&cnt2==1)) 
	{
		printf("No");
		return 0;
	}
	if(!st) st=1;
	dfs(st);
	for(int i=sk;i;i--) printf("%d ",s[i]);
	return 0;
}
2024/10/24 13:41
加载中...