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

將兩種的種類並查集轉化爲普通並查集

例題:poj 1703 和 hdu 1829

當有N各節點且他們之間只有兩種關係時,可以再虛擬出N個節點,對這2*N個節點進行操作即可
//hdu1829
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 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.");
					}
					
				}
				
				
				
			}
			
			
		}
		
		
		
		
	}
	
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章