【待修改】nyoj 38 最小生成树
2014-09-04 13:20
281 查看
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 布线问题(最小生成树--kruskal)
- NYOJ 38最小生成树布线问题
- NYOJ 38 布线问题 最小生成树 prim与Kruskal
- 最小生成树--->NYOJ-38 布线问题
- 最小生成树——并查集+Kruskal(NYOJ 38 布线问题)
- nyoj--38 布线问题(最小生成树)
- nyoj 38 简单并查集的应用&最小生成树
- nyoj 38 简单并查集的应用&最小生成树
- nyoj 38 布线问题【最小生成树】
- Nyoj 38 布线问题[最小生成树(Prim&&Kruscal)]
- nyoj 38 布线问题(kruskal 最小生成树)
- NYOJ 38 布线问题(带权最小生成树,并查集)
- nyoj38(最小生成树)
- NYOJ 38(最小生成树)
- NYOJ 38 布线问题 (最小生成树 Kruskal)
- NYOJ-38 布线问题(图论,最小生成树,Prime)
- nyoj 38 布线问题(最小生成树)
- 最小生成树 hdoj1233 nyoj38
- NYOJ 38-布线问题:最小生成树
- 布线问题(nyoj 38) 最小生成树