• poj1733 Parity game


    参见算法竞赛进阶指南190页

    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int n, m, num[10005], qwq=1, fa[10005], dis[10005];
    char ss[15];
    struct Node{
    	int l, r, ans;
    }nd[5005];
    int myfind(int x){
    	if(x==fa[x])	return x;
    	int rot=myfind(fa[x]);
    	dis[x] ^= dis[fa[x]];
    	return fa[x]=rot;
    }
    int main(){
    	cin>>n>>m;
    	n = 0;
    	for(int i=1; i<=m; i++){
    		scanf("%d %d %s", &nd[i].l, &nd[i].r, ss);
    		nd[i].l--;
    		nd[i].ans = ss[0]=='o';
    		num[++n] = nd[i].l;
    		num[++n] = nd[i].r;
    	}
    	sort(num+1, num+1+n);
    	n = unique(num+1, num+1+n) - num - 1;
    	for(int i=1; i<=m; i++){
    		nd[i].l = lower_bound(num+1, num+1+n, nd[i].l) - num;
    		nd[i].r = lower_bound(num+1, num+1+n, nd[i].r) - num;
    	}
    	for(int i=1; i<=n; i++)	fa[i] = i;
    	for(int i=1; i<=m; i++){
    		int r1=myfind(nd[i].l), r2=myfind(nd[i].r);
    		if(r1==r2){
    			if(nd[i].ans!=(dis[nd[i].l]^dis[nd[i].r]))	break;
    		}
    		else{
    			fa[r1] = r2;
    			dis[r1] = dis[nd[i].l] ^ dis[nd[i].r] ^ nd[i].ans;
    		}
    		qwq++;
    	}
    	printf("%d
    ", qwq-1);
    	return 0;
    }
    

    另一种写法

    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int n, m, num[10005], fa[20005];
    char ss[15];
    struct Node{
    	int l, r, ans;
    }nd[5005];
    int p(int x){
    	return x;
    }
    int q(int x){
    	return x+n;
    }
    int myfind(int x){
    	return fa[x]==x?x:fa[x]=myfind(fa[x]);
    }
    int main(){
    	cin>>n>>m;
    	n = 0;
    	for(int i=1; i<=m; i++){
    		scanf("%d %d %s", &nd[i].l, &nd[i].r, ss);
    		nd[i].l--;
    		nd[i].ans = ss[0]=='o';
    		num[++n] = nd[i].l;
    		num[++n] = nd[i].r;
    	}
    	sort(num+1, num+1+n);
    	n = unique(num+1, num+1+n) - num - 1;
    	for(int i=1; i<=m; i++){
    		nd[i].l = lower_bound(num+1, num+1+n, nd[i].l) - num;
    		nd[i].r = lower_bound(num+1, num+1+n, nd[i].r) - num;
    	}
    	for(int i=1; i<=n+n; i++)	fa[i] = i;
    	for(int i=1; i<=m; i++){
    		int uu=nd[i].l, vv=nd[i].r;
    		if(myfind(p(uu))==myfind(q(vv)) || myfind(p(uu))==myfind(p(vv))){
    			if(nd[i].ans!=(myfind(p(uu))==myfind(q(vv)))){
    				cout<<i-1<<endl;
    				return 0;
    			}
    		}
    		else{
    			if(nd[i].ans){
    				fa[myfind(p(uu))] = myfind(q(vv));
    				fa[myfind(q(uu))] = myfind(p(vv));
    			}
    			else{
    				fa[myfind(p(uu))] = myfind(p(vv));
    				fa[myfind(q(uu))] = myfind(q(vv));
    			}
    		}
    	}
    	cout<<m;
    	return 0;
    }
    
  • 相关阅读:
    淘宝网六个质量属性场景
    架构漫谈阅读笔记2
    poj 3304
    poj 2318
    bzoj 4008
    任意模数NTT
    CF623E
    CF712E
    bzoj 1925
    bzoj 4710
  • 原文地址:https://www.cnblogs.com/poorpool/p/8457418.html
Copyright © 2020-2023  润新知