省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
题目链接
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cmath>
using namespace std;
const int Max=100,Maxval=INT_MAX;
bool visited[Max];
int dist[Max];
int n,m;
struct graph{
int map[Max][Max];
int v;
void creatgraph(int n,int m);
};
void graph::creatgraph(int n,int m){
int i,j,a,b,c,d;
v=n;
for(i=0;i<v;i++){
for(j=0;j<v;j++){
map[i][j]=Maxval;
}
map[i][i]=0;
}
for(i=0;i<m;i++){
cin>>a>>b>>c>>d;
if(d==1)c=0;
a--;
b--;
map[a][b]=c;
map[b][a]=c;
}
}
int mine(int v)
{
int mi=Maxval;
int k=-1;
for(int i=0;i<v;i++)
{
if(mi>dist[i]&&visited[i]==false)
{
mi=dist[i];
k=i;
}
}
return k;
}
int prime(graph g, int u)
{
for(int i=0;i<n;i++)
dist[i]=g.map[u][i];
fill(visited,visited+n,false);
visited[u]=true;
for(int i=1;i<=n-1;i++)
{
int k=mine(n);
visited[k]=true;
for(int j=0;j<n;j++)
{
if(visited[j]==false&&g.map[k][j]<dist[j])
dist[j]=g.map[k][j];
}
}
int ans=0;
for(int i=0;i<n;i++)
ans+=dist[i];
return ans;
}
int main(){
int min;
while(cin>>n){
if(n==0)break;
m=n*(n-1)/2;
graph g;
g.creatgraph(n,m);
min=prime(g,0);
cout<<min<<endl;
}
return 0;
}