您的位置:首页 > 其它

ACM:prim最小生成树题目汇总

2016-05-03 19:20 495 查看
1.http://115.28.138.223/view.page?gpid=T18

import java.util.Scanner;
public class Main{
static final int MAX=Integer.MAX_VALUE;
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int n=input.nextInt();
int m=input.nextInt();
int [][]adjMatrix=new int

;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
adjMatrix[i][j]=MAX;
}
for(int i=0;i<m;i++){
int start=input.nextInt();
int end=input.nextInt();
int weight=input.nextInt();
adjMatrix[start-1][end-1]=weight;
adjMatrix[end-1][start-1]=weight;
}
int result=priAlgorithm(adjMatrix,n,0);
System.out.println(result);
}
static int priAlgorithm(int [][]adjMatrix,int numberVertex,int initialVertex){
boolean[]visited=new boolean[numberVertex];
for(int i=0;i<numberVertex;i++){
visited[i]=false;
}
int min=MAX;
int mincost=0;
int []lowcostLine=new int[numberVertex];
for(int i=0;i<numberVertex;i++){
lowcostLine[i]=adjMatrix[initialVertex][i];
}
visited[initialVertex]=true;
int position=initialVertex;
for(int i=1;i<numberVertex;i++){//易错点:只循环n-1次
for(int j=0;j<numberVertex;j++){
if(visited[j]==false&&lowcostLine[j]<min){
min=lowcostLine[j];
position=j;
}
}
mincost+=min;
visited[position]=true;
min=MAX;      //易错点:每遍历一次,还原min
for(int k=0;k<numberVertex;k++){
if(visited[k]==false&&adjMatrix[position][k]<lowcostLine[k]){
lowcostLine[k]=adjMatrix[position][k];
}
}
}
return mincost;
}


其他类似的题目还有:Agri-Net http://poj.org/problem?id=1258

2.http://poj.org/problem?id=2421

此题要求在已经建有路的基础上进行最小生成树的查找,只需将已连接的路径的权值赋值为零即可。

import java.util.Scanner;
public class Main{
public static int MAX=Integer.MAX_VALUE;
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int VillageNumber=input.nextInt();
int [][]map=new int[VillageNumber][VillageNumber];
for(int i=0;i<VillageNumber;i++)
for(int j=0;j<VillageNumber;j++)
map[i][j]=MAX;
for(int i=0;i<VillageNumber;i++)
for(int j=0;j<VillageNumber;j++)
map[i][j]=input.nextInt();
int RoadNumber=input.nextInt();
for(int i=0;i<RoadNumber;i++){
int start=input.nextInt();
int end=input.nextInt();
map[start-1][end-1]=0;
map[end-1][start-1]=0;
}
int result=priAlgorithm(map,VillageNumber,0);
System.out.println(result);

}
static int priAlgorithm(int [][]adjMatrix,int numberVertex,int initialVertex){
boolean[]visited=new boolean[numberVertex];
for(int i=0;i<numberVertex;i++){
visited[i]=false;
}
int min=MAX;
int mincost=0;
int []lowcostLine=new int[numberVertex];
for(int i=0;i<numberVertex;i++){
lowcostLine[i]=adjMatrix[initialVertex][i];
}
visited[initialVertex]=true;
int position=initialVertex;
for(int i=1;i<numberVertex;i++){//易错点:只循环n-1次
for(int j=0;j<numberVertex;j++){
if(visited[j]==false&&lowcostLine[j]<min){
min=lowcostLine[j];
position=j;
}
}
mincost+=min;
visited[position]=true;
min=MAX;      //易错点:每遍历一次,还原min
for(int k=0;k<numberVertex;k++){
if(visited[k]==false&&adjMatrix[position][k]<lowcostLine[k]){
lowcostLine[k]=adjMatrix[position][k];
}
}
}
return mincost;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: