70求条
查看原帖
70求条
431095
Druid楼主2024/11/1 18:14
#include <bits/stdc++.h>
using namespace std;
struct line
{
	int a;
	int b;
} ln[21451];
int n,m,t,insd[214],outsd[214],it,ot,flag;
int intag[21451][2],outag[21451][2];
int cir[214],is,os,a,b,k;
void solve()
{
	it=1;
	ot=1;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		cin>>ln[i].a>>ln[i].b;
	for(int i=1;i<=n;i++)
	{
		cin>>k;
		cir[k]=i;
		insd[i]=1;
		outsd[i]=1;
	}
	
	for(int i=1;i<=m;i++)
	{
		a=cir[ln[i].a];
		b=cir[ln[i].b];
		if(a-b==1 or b-a==1 or (a==n and b==1) or (a==1 and b==n))//是环上的边 
			continue;
		if(a>b)
			swap(a,b);
		if(insd[a]==insd[b] or intag[insd[a]][0]==b or intag[insd[a]][1]==b or intag[insd[b]][0]==a or intag[insd[b]][1]==a)//在同一集合 
		{
			flag=insd[a];
			it++;
			intag[it][0]=a;
			intag[it][1]=b;
			for(int j=a+1;j!=b;j++)
			{
				if(insd[j]==flag)
				{
					insd[j]=it;
					if(j==intag[flag][0])
						intag[flag][0]=-1;
					else if(j==intag[flag][1])
						intag[flag][1]=-1;
				}
				if(j>=n)
					j=0;
			}
			continue;
		}
		if(outsd[a]==outsd[b] or outag[outsd[a]][0]==b or outag[outsd[a]][1]==b or outag[outsd[b]][0]==a or outag[outsd[b]][1]==a)
		{
			flag=outsd[a];
			ot++;
			outag[ot][0]=a;
			outag[ot][1]=b;
			for(int j=a+1;j!=b;j++)
			{
				if(outsd[j]==flag)
				{
					outsd[j]=ot;
					if(j==outag[flag][0])
						outag[flag][0]=-1;
					else if(j==outag[flag][1])
						outag[flag][1]=-1;
				}
				if(j>=n)
					j=0;
			}
			continue;
		}
		/*for(int i=1;i<=n;i++)
			cout<<insd[i];
		cout<<"\n";
		for(int i=1;i<=n;i++)
			cout<<outsd[i];*/
		cout<<"NO\n";
		return;
	}
	/*for(int i=1;i<=n;i++)
		cout<<insd[i];
	cout<<"\n";
	for(int i=1;i<=n;i++)
		cout<<outsd[i];*/
	cout<<"YES\n";
	return;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
		solve();
	return 0;
} 

都是NO的点输出YES,感觉是少判了什么东西

2024/11/1 18:14
加载中...