程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 1703 find them,catch them

poj 1703 find them,catch them

編輯:C++入門知識

這個題目是典型的種類判斷的並查集,種類判斷的並查集似乎無一例外的全部用到了relation(與祖先的關系),然後就是找關系化簡式子然後套用種類判斷並查集的通常做法就好。這個題目就是告訴你,現在一個城市裡面有兩個幫派,任何一個幫派分子不是屬於這個幫派就是屬於另一個幫派。現在告訴你現在有多少幫派分子,然後有m句話,其中A開頭的表示詢問這兩個人的關系如何,D是告訴你這兩個人不是一伙的。附代碼。

[cpp]
<SPAN style="FONT-SIZE: 18px">#include<iostream> 
#include<stdio.h>  
using namespace std; 
int father[100000+10]; 
int relation[100000+10]; 
int flag; 
int find_ant(int x) 

    if(x!=father[x]) 
    { 
        int temp=father[x];; 
        father[x]=find_ant(father[x]); 
        relation[x]=(relation[x]+relation[temp])%2; 
    } 
    return father[x]; 

void unin(int x,int y) 

    int x_x,y_y; 
    x_x=find_ant(x); 
    y_y=find_ant(y); 
    if(x_x!=y_y) 
    { 
        father[y_y]=x_x; 
        relation[y_y]=(relation[x]+relation[y]+1)%2; 
    } 
    else { 
        if(relation[x]==relation[y]) 
            flag=1; 
        else flag=0; 
    } 

int main() 

    int T,a,b,n,m,i,p,q; 
    char c; 
    cin>>T; 
    while(T--) 
    { 
        cin>>n>>m; 
        for(i=1;i<=n;i++) 
        { 
            father[i]=i; 
            relation[i]=0; 
        } 
        for(i=1;i<=m;i++) 
        { 
            getchar(); 
            c=getchar(); 
            scanf("%d%d",&a,&b); 
            if(c=='A') 
            { 
                p=find_ant(a); 
                q=find_ant(b); 
                if(p!=q) 
                    cout<<"Not sure yet."<<endl; 
                else { 
                    unin(a,b); 
                    if(flag==1) 
                        cout<<"In the same gang."<<endl; 
                    else cout<<"In different gangs."<<endl; 
                } 
            } 
            else if(c=='D') 
            { 
                unin(a,b); 
            } 
        } 
    } 
    return 0; 

 
</SPAN> 

#include<iostream>
#include<stdio.h>
using namespace std;
int father[100000+10];
int relation[100000+10];
int flag;
int find_ant(int x)
{
 if(x!=father[x])
 {
  int temp=father[x];;
  father[x]=find_ant(father[x]);
  relation[x]=(relation[x]+relation[temp])%2;
 }
 return father[x];
}
void unin(int x,int y)
{
 int x_x,y_y;
 x_x=find_ant(x);
 y_y=find_ant(y);
 if(x_x!=y_y)
 {
  father[y_y]=x_x;
  relation[y_y]=(relation[x]+relation[y]+1)%2;
 }
 else {
  if(relation[x]==relation[y])
   flag=1;
  else flag=0;
 }
}
int main()
{
 int T,a,b,n,m,i,p,q;
 char c;
 cin>>T;
 while(T--)
 {
  cin>>n>>m;
  for(i=1;i<=n;i++)
  {
   father[i]=i;
   relation[i]=0;
  }
  for(i=1;i<=m;i++)
  {
   getchar();
   c=getchar();
   scanf("%d%d",&a,&b);
   if(c=='A')
   {
    p=find_ant(a);
    q=find_ant(b);
    if(p!=q)
     cout<<"Not sure yet."<<endl;
    else {
     unin(a,b);
     if(flag==1)
      cout<<"In the same gang."<<endl;
     else cout<<"In different gangs."<<endl;
    }
   }
   else if(c=='D')
   {
    unin(a,b);
   }
  }
 }
 return 0;
}

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved