| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
why ac/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
//package kruskal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
/**
*
* @author yepin
*/
class MySet
{
ArrayList <Integer> set = new ArrayList<Integer>();
}
class Edge
{
int u;
int v;
int weight;
}
class Map
{
int [][] cost = new int [Kruskal.MaxSize][Kruskal.MaxSize];
}
class MyComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
Edge a = (Edge)o1;
Edge b = (Edge)o2;
return a.weight-b.weight;
}
}
class Kruskal
{
/*
* MST-Kruskal(G,w)
* A = null
* for each vertex v in V[G]
* do MAKE-SET(v)
* sort the edges of E into nondecreasing order by weight up
* for each edge (u,v) in E ,taken in nondecreasing order by weight
* do if FIND_SET(u) != FIND_SET(v)
* then (u,v) add to A
* UNION(u,v)
* return
*/
final static int MaxSize = 101;
boolean [][] mst = new boolean [MaxSize][MaxSize];
Map map = new Map();
ArrayList <MySet> sets = new ArrayList<MySet>();
ArrayList <Edge> edges = new ArrayList<Edge>();
int N;
int minicost;
Kruskal(int n,Map m)
{
minicost = 0;
N = n;
this.map = m;
init();
}
public void init()
{
initMST();
initSet();
initEdge();
}
public void initMST()
{
for(int i=0;i<=N;i++)
{
for(int j=0;j<=N;j++)
{
mst[i][j] = false;
}
}
}
public void initSet()
{
for(int i=1;i<=N;i++)
{
MySet s = new MySet();
s.set.add(i);
sets.add(s);
}
}
public void initEdge()
{
for(int i=1;i<=N;i++)
{
for(int j= i+1;j<=N;j++)
{
Edge e = new Edge();
e.u = i;
e.v = j;
e.weight = map.cost[i][j];
edges.add(e);
}
}
}
public int find(int v)
{
for(int i=0;i<sets.size();i++)
{
if(sets.get(i).set.contains(v))
{
return i;
}
}
return -1;
}
public void union(int u,int v,int fu,int fv)
{
MySet t = new MySet();
for(int i=0;i<sets.get(fu).set.size();i++)
{
t.set.add(sets.get(fu).set.get(i));
}
for(int i=0;i<sets.get(fv).set.size();i++)
{
t.set.add(sets.get(fv).set.get(i));
}
int big = (fu>fv)?fu:fv;
int small = (fu<fv)?fu:fv;
sets.remove(big);
sets.remove(small);
sets.add(t);
}
/*
* this is a shit
*/
public int miniCost()
{
return minicost;
}
/*
* another is a shit
*/
public void kruskal()
{
Comparator comp = new MyComparator();
Collections.sort(edges,comp);
for(int i=0;i<edges.size();i++)
{
int u = edges.get(i).u;
int v = edges.get(i).v;
if(mst[u][v]) continue;
int fu = find(u);
int fv = find(v);
if(fu != fv)
{
mst[u][v] = true;
mst[v][u] = true;
union(u,v,fu,fv);
minicost += map.cost[u][v];
}
}
}
}
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
new Main().run();
}
public void run()
{
Scanner scan = new Scanner(System.in);
Map newmap = new Map();
int n = scan.nextInt();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
newmap.cost[i][j] = scan.nextInt();
}
}
Kruskal k = new Kruskal(n,newmap);
int m = scan.nextInt();
for(int i=0;i<m;i++)
{
int u = scan.nextInt();
int v = scan.nextInt();
int fu = k.find(u);
int fv = k.find(v);
if(fu != fv)
{
k.mst[u][v] = true;
k.mst[v][u] = true;
k.union(v, u,fu,fv);
}
}
k.kruskal();
System.out.println(k.miniCost());
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator