URAL 1003 Parity(并查集)

来源:互联网 发布:网络最火尴舞视频 编辑:程序博客网 时间:2024/06/05 20:55

题目链接 http://acm.timus.ru/problem.aspx?space=1&num=1003

思路参考 http://www.cnblogs.com/scau20110726/archive/2013/04/03/2998722.html


#include <iostream>#include <algorithm>#include <cstdio>#include <string>#include <cstring>using namespace std;const int maxn=10000+15;struct node{    int l,r;    char str[15];}G[maxn];int a[maxn],id[maxn*2],cnt,n,m;void initial(){    cnt=0;    for(int i=0;i<maxn*2;i++)  id[i]=i;}void input(){    scanf("%d",&m);    for(int i=0;i<m;i++)    {        scanf("%d %d %s",&G[i].l,&G[i].r,G[i].str);        a[cnt++]=G[i].l;        a[cnt++]=G[i].r;    }}int Find(int x){    if(x!=id[x])  id[x]=Find(id[x]);    return id[x];}void solve(){    a[cnt++]=0;    sort(a,a+cnt);    cnt=unique(a,a+cnt)-a;    for(int i=0;i<m;i++)    {        int l=lower_bound(a,a+cnt,G[i].l)-a-1;        int r=lower_bound(a,a+cnt,G[i].r)-a;        int p=Find(l),pp=Find(l+cnt);        int q=Find(r),qq=Find(r+cnt);        if(G[i].str[0]=='e')        {            if(p==qq || q==pp)            {                printf("%d\n",i);                return ;            }            id[p]=q,id[pp]=qq;        }        else        {            if(p==q || pp==qq)            {                printf("%d\n",i);                return ;            }            id[p]=qq,id[pp]=q;        }    }    printf("%d\n",m);}int main(){    while(scanf("%d",&n)!=EOF)    {        if(n==-1)  break;        initial();        input();        solve();    }    return 0;}


0 0
原创粉丝点击