题意:某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。计算最小的公路总长度。
思路:求连通所有村庄的最小公路总长度,即求最小生成树问题,利用prim算法,将村庄看做一个图,求最小生成树。题目中相比上一题,增加了一个状态,对于已经修好的公路,将其成本改为0,否则不变。
感想:对于已修建公路,成本为0,其他状态不变,在思路是与上一个题相同,代码有借鉴成分。
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int map[100][100];
int r[100],visited[100];
int m,n;
int prim(){
int i,j,p,t,min,pos;
int ans=0,cnt=0;
visited[1]=1;
r[cnt++]=1;
while(cnt<n){
t=cnt;
min=10000000;
for(i=0;i<t;i++){
p=r[i];
for(j=1;j<=n;j++){
if(!visited[j]&&map[p][j]<min){
min=map[p][j];
pos=j;
}
}
}
ans+=min;
r[cnt++]=pos;
visited[pos]=1;
}
return ans;
}
int main(){
int a,b,c,d,i;
while(scanf("%d",&n)){
if(n==0) break;
memset(map,10000000,sizeof(map));
memset(visited,0,sizeof(visited));
m=n*(n-1)/2;
for(i=0;i<m;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
if(d==0)
map[a][b]=map[b][a]=c;
else
map[a][b]=map[b][a]=0;
}
printf("%d\n",prim());
}
return 0;
}