標籤:style blog color java ar for art div sp
package nyoj;import java.util.Scanner;public class Main { public static void main(String args[]) { //System.out.println(Integer.MAX_VALUE); Scanner scn=new Scanner(System.in); int len=scn.nextInt(); while(len-->0) { int v=scn.nextInt(); int e=scn.nextInt(); boolean visit[]=new boolean[v+1];//點是否被訪問 int map[][]=new int[v+1][v+1];//兩個點之間的距離 int low[]=new int[v+1]; //讀入map //初始化數組為無情大 for(int i=1;i<v+1;i++) { for(int j=1;j<v+1;j++) { map[i][j]=Integer.MAX_VALUE; if(i==j)map[i][i]=0; } } for(int i=0;i<e;i++) { int x=scn.nextInt(); int y=scn.nextInt(); map[x][y]=map[y][x]=scn.nextInt(); } int ans=prime(map,v,e); System.out.println(ans); int start=scn.nextInt(); for(int i=1;i<v;i++) { int tem=scn.nextInt(); if(tem<start)start=tem; } //System.out.println(ans+start); } } private static int prime(int[][] map,int v,int e) { // TODO Auto-generated method stub boolean visit[]=new boolean[v+1];//點是否被訪問 int low[]=new int[v+1]; visit[1]=true; int ans=0; //初始化low,就是集合到他的距離 for(int i=1;i<=v;i++) { if(!visit[i]) { low[i]=map[1][i]; } } //不斷的加點,每次加一個,共加v-1次 for(int i=2;i<=v;i++) { //在非訪問節點中選擇最low的點 int k = 0; int min=1<<31-1; for(int j=1;j<=v;j++) { if(!visit[j]&&low[j]<min) min=low[k=j]; } ans+=min;//選中最小的邊 //選中k個節點 visit[k]=true; //更新以k開頭的點 for(i=1;i<v+1;i++) { if(!visit[i]&&map[k][i]<low[i]) { low[i]=map[k][i]; } } } return ans; }}
【待修改】nyoj 38 最小產生樹