本文主要是介绍GOJ1446 并查集判断逻辑错误(是否说谎),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这道题暑假做过,但是忘了。
思路:因为无法直接将输入的两个数放到一个并查集,所以可以让对应的数字与足够远但是又能够一一对应回来的数做联合。
#include<cstdio>
#include<cstring>
#include<map>
#include<iostream>
using namespace std;
int n,l,k,a,b,vis;int main(){scanf("%d",&n);for(int i=0;i<n;i++){vis=0;map<int,int> t;map<int,int>::iterator it1;map<int,int>::iterator it2;//memset(t,-1,sizeof(t));scanf("%d %d",&l,&k);for(int j=0;j<k;j++){scanf("%d %d",&a,&b);it1=t.find(a);it2=t.find(b);if(a==b)vis=1;else if(it1==t.end()&&it2==t.end()){t[a]=1;//t[1]=1t[b]=0;//t[2]=0 t[3]=1//cout<<"a:"<<a<<" "<<t[a]<<" "<<"b:"<<b<<" "<<t[b]<<endl;}else if(it1!=t.end()&&it2==t.end()){t[b]=!t[a];//cout<<"a:"<<a<<" "<<t[a]<<" "<<"b:"<<b<<" "<<t[b]<<endl;}else if(it1==t.end()&&it2!=t.end()){t[a]=!t[b];//cout<<"a:"<<a<<" "<<t[a]<<" "<<"b:"<<b<<" "<<t[b]<<endl;}else if(it1!=t.end()&&it2!=t.end())if(t[a]==t[b])vis=1;}printf("Answer #%d:\n",i+1);if(vis==1)printf("YES\n");elseprintf("NO\n");}return 0;
}
这篇关于GOJ1446 并查集判断逻辑错误(是否说谎)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!