救命...调了快一天了,实在受不了了
查看原帖
救命...调了快一天了,实在受不了了
218162
Bobbyman楼主2022/10/4 18:09
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
void scan(int &val)
{
	val=0;
	int fu=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')break;
		ch=getchar();
	}
	if(ch=='-')fu=-1;
	else val=ch-'0';
	ch=getchar();
	while(ch>='0'&&ch<='9')
	{
		val=val*10+ch-'0';
		ch=getchar();
	}
	val*=fu;
	return;
}
const int N=2*(1e5+7);
struct edge
{
	int to,nxt,id;
}e[N<<1];
int t,n,m,head[N<<1],tot,ea[N<<1],eb[N<<1],c[N<<1],dep[N<<1],fa[N<<1];
bool vis[N<<1];
map<int,int>cnt;
void add(int a,int b,int c)
{
	e[++tot].to=b;
	e[tot].id=c;
	e[tot].nxt=head[a];
	head[a]=tot;
	return;
}
void dfs(int u,int fath)
{
	fa[u]=fath;
	dep[u]=dep[fath]+1;
	vis[u]=1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(!vis[v])c[e[i].id]=1,dfs(v,u);
	}
	return;
}
int main()
{
	scan(t);
	while(t--)
	{
		for(int i=0;i<=m;i++)fa[i]=c[i]=head[i]=dep[i]=ea[i]=eb[i]=vis[i]=0;
		tot=0;
		cnt.clear();
		scan(n),scan(m);
		for(int i=1;i<=m;i++)
		{
			int a,b;
			scan(a),scan(b);
			add(a,b,i),add(b,a,i);
			ea[i]=a,eb[i]=b;
		}
		dfs(1,1);
		for(int i=1;i<=m;i++)if(!c[i])cnt[ea[i]]++,cnt[eb[i]]++;
		//printf("%d\n",(int)cnt.size());
		if((int)cnt.size()==3&&m==n+2)
		{
			//puts("\n");
			int u=0,a=0,b=0;
			for(auto i:cnt)if(dep[u]<dep[i.first])u=i.first;
			for(int i=head[u];i;i=e[i].nxt)
			{
				int v=e[i].to;
				if(v==fa[u]&&c[e[i].id])b=e[i].id;
				if(!c[e[i].id])a=e[i].id;
			}
			c[a]=1,c[b]=0;
		}
		for(int i=1;i<=m;i++)printf("%d",c[i]);
		puts("");
	}
	return 0;
}

2022/10/4 18:09
加载中...