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; } }
时间: 2024-11-05 14:46:06