種類為兩種時,並查集的解題應用poj1703和hdu1829

來源:互聯網
上載者:User
將兩種的種類並查集轉化為普通並查集 例題:poj 1703 和 hdu 1829 當有N各節點且他們之間只有兩種關係時,可以再虛擬出N個節點,對這2*N個節點進行操作即可
//hdu1829import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.StreamTokenizer;public class hdu1829ABugsLife {static int max=6010;static int parent[]=new int[max];static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));static  PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));final static  int nextInt() throws IOException {in.nextToken();return (int) in.nval;}static void init(){for(int i=0;i<max;i++)parent[i]=i;}static int find(int x){if(x!=parent[x])parent[x]=find(parent[x]);return parent[x];}static void union(int a,int b){int fa=find(a);int fb=find(b);if(fa==fb)return;parent[fa]=fb;}public static void main(String[] args) throws IOException {int num=nextInt();for(int i=1;i<=num;i++){init();int n=nextInt();int m=nextInt();int data1[]=new int[m+1];int data2[]=new int[m+1];for(int j=1;j<=m;j++){data1[j]=nextInt();data2[j]=nextInt();}boolean mark=true;for(int j=1;j<=m;j++){int a=data1[j];int b=data2[j];int fa=find(a);int fb=find(b);//System.out.println("fa :"+fa+"fb :"+fb);if(fa==fb){System.out.println("Scenario #"+i+":");System.out.println("Suspicious bugs found!");mark=false;//System.out.println(mark);break;}else{union(a,b+n);union(b,a+n);//union(a,b);}}if(mark){System.out.println("Scenario #"+i+":");System.out.println("No suspicious bugs found!");}System.out.println();}}}

//poj1703

/*將n個人的看作是有2*n個,若a與b不在同一個集合時,就將a與(b+n)合并,b與(a+n)合并 * 這樣就轉化為了普通並查集 */import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.StreamTokenizer;public class poj1703T {static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));static  PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));final static  int nextInt() throws IOException {in.nextToken();return (int) in.nval;}static String next() throws IOException {in.nextToken();return (String)in.sval;}static int max=300010;static int parent[]=new int[max];static void init(){for(int i=0;i<max;i++)parent[i]=i;}static int find(int x){if(x!=parent[x]){parent[x]=find(parent[x]);}return parent[x];}static void union(int a,int b){int fa=find(a);int fb=find(b);if(fa==fb)return;parent[fa]=fb;}public static void main(String[] args) throws IOException {//Scanner in=new Scanner(System.in);int num=nextInt();while(num--!=0){init();int n=nextInt();int m=nextInt();for(int i=1;i<=m;i++){String inc=next();int a=nextInt();int b=nextInt();if(inc.equals("D")){union(a,b+n);union(b,a+n);}else {if(find(a)==find(b))System.out.println("In the same gang.");else if(find(a)==find(b+n)||find(b)==find(a+n)){System.out.println("In different gangs.");}else{System.out.println("Not sure yet.");}}}}}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.