这是我赛时的贪心代码:
#include<bits/stdc++.h>
#define maxn 200005
using namespace std;
int t,n,a[maxn],b[maxn],vis1[maxn],vis2[maxn];
int main()
{
cin>>t;
while(t--)
{
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
bool flag=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
}
for(int i=1;i<=n;i++)
{
if(a[i]==b[i])
{
flag=1;
break;
}
else if((!vis1[a[i]])&&(!vis1[b[i]])&&(vis2[a[i]]||vis2[b[i]]))
{
vis1[a[i]]=1;
vis1[b[i]]=1;
}
else if((!vis2[a[i]])&&(!vis2[b[i]])&&(vis1[a[i]]||vis1[b[i]]))
{
vis2[a[i]]=1;
vis2[b[i]]=1;
}
else if((vis1[a[i]]||vis1[b[i]])&&(vis2[a[i]]||vis2[b[i]]))
{
flag=1;
break;
}
else
{
vis2[a[i]]=1;
vis2[b[i]]=1;
}
}
if(flag)
{
cout<<"No"<<endl;
}
else cout<<"Yes"<<endl;
}
return 0;
}
大概思路就是如果只有一个满足条件,就放进那一个。
如果两个都满足,就随便找一个放。
然后WA on #2,虽然运行时间挺长的。
感觉是假了,不知道有没有hack数据,求一下
然后再求一下正解做法思路
lz要去睡觉了,可能无法及时回复,请见谅