Cod sursa(job #1478684)

Utilizator x3medima17Dima Savva x3medima17 Data 29 august 2015 12:06:20
Problema Arbore partial de cost minim Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.06 kb
import java.util.Scanner;
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;

public class First
{
	public static void main(String args[]) throws FileNotFoundException 
	{
		int N,M;
		
		Scanner scanner = new Scanner(new File("apm.in"));
		N = scanner.nextInt();
		M = scanner.nextInt();

		Edge[] edges = new Edge[M];
		for(int i=0;i<M;i++)
		{
			int a,b,c;
			a = scanner.nextInt()-1;
			b = scanner.nextInt()-1;
			c = scanner.nextInt();
			edges[i] = new Edge(a,b,c);
		}		
		Arrays.sort(edges,Edge.EdgeComparator);
		int cost = 0;
		int nodes = 0;
		DisjointSet set = new DisjointSet(N);
		String str = new String();
		for(int i=0;i<M;i++)
		{
			int a = edges[i].from;
			int b = edges[i].to;
			// System.out.println(i);
			if(!set.Find(a,b))
			{
				set.Union(a,b);
				cost += edges[i].value;
				str += (a+1)+" "+(b+1)+"\n";
				nodes++; 
			}
		}
		// System.out.println(str);
		Writer writer = null;
		try{
			writer = new FileWriter("apm.out");
			String pre = new String();
			pre = cost+"\n"+nodes+"\n";
			writer.write(pre+str);
			writer.close();
		}catch(IOException e){
			System.out.println("error");
		}
	}

	private static class Edge
	{
		int from,to,value;
		private Edge(int from,int to,int value)
		{
			this.from = from;
			this.to = to;
			this.value = value;
		}

		private int CompareTo(Edge compareEdge)
		{
			return this.value - compareEdge.value;
		}


		public static Comparator<Edge> EdgeComparator
					 = new Comparator<Edge>()
		{
			public  int compare(Edge a, Edge b)
			{
				return a.CompareTo(b);
			}
		};
	}

	private static class DisjointSet
	{
		int[] arr;
		private DisjointSet(int N)
		{
			int[] arr = new int[N];
			this.arr = arr;
			for(int i=0;i<N;i++)
				arr[i] = i;
		}

		private int Root(int k)
		{
			while(arr[k] != k)
				k = arr[k];
			return k;
		}

		private void Union(int i, int j)
		{
			arr[Root(i)] = arr[Root(j)];
		}

		private boolean Find(int i,int j)
		{
			return (Root(i) == Root(j));
		}

	}
}