http://acm.hdu.edu.cn/showproblem.php?pid=1102
题目标题:Constructing Roads
题目大意:就是一个算最小路径的问题
这个题我用的prim算法解得,需要注意两个城市已建好的情况
#include<iostream>
#include<stdio.h>
#include<string.h>
#define debug 0
using namespace std;
int main()
{
int n;
int sum=0;
cin>>n;
int a[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
int Q;
cin>>Q;
for(int i=0;i<Q;i++){
int x,y;
cin>>x>>y;
a[x-1][y-1]=0;
a[y-1][x-1]=0;
}
if(debug){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
int num[n];
for(int i=0;i<n;i++) {
num[i]=1001;
}
bool Judge[n];
memset(Judge,0,n*sizeof(bool));
int now=0;
Judge[0]=true;
num[0]=1001;
for(int i=0;i<n-1;i++){
for(int j=0;j<n;j++){
if(now!=j && a[now][j]<num[j] && Judge[j]==false){
num[j]=a[now][j];
}
}
int sign;
int min=1001;
for(int j=0;j<n;j++){
if(num[j]<min && Judge[j]==false){
min=num[j];
sign=j;
}
}
if(min!=-1){
sum+=min;
}
if(debug){
for(int j=0;j<n;j++) cout<<num[j]<<' ';
cout<<endl;
for(int j=0;j<n;j++) cout<<Judge[j]<<' ';
cout<<endl;
}
num[now]=1001;
Judge[sign]=true;
now=sign;
if(debug){
cout<<sum<<endl;
}
}
cout<<sum;
return 0;
}