题目:http://acm.hdu.edu.cn/showproblem.php?pid=1879
a,b,权值,flag
为0时未修,1时这条已经修了,所以费用为0;
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=110;
const int maxcost=99999999;
int graph[maxn][maxn],lowcost[maxn];
int prim(int n){
int lowcost[maxn];
int mst[maxn];
int i,j,minn,minid,sum=0;
for(i=2;i<=n;i++){//lowcost初始化
lowcost[i]=graph[1][i];
mst[i]=1;
}
mst[1]=0;
for(i=2;i<=n;i++){
minn=maxcost;
minid=0;
for(j=2;j<=n;j++){ //比较
if(lowcost[j]<minn&&lowcost[j]!=-1){ //上一层已经把找过的赋为-1
minn=lowcost[j];
minid=j;
}
}
if(minn==maxcost)
return -1; //不连通
//printf("%c - %c : %d\n", mst[minid] + 'A' - 1, minid + 'A' - 1, min);
sum+=minn;
lowcost[minid]=-1;
for(j=2;j<=n;j++){ //找新起点,谁小换谁,相同不换
if(graph[minid][j]<lowcost[j]){
lowcost[j]=graph[minid][j];
mst[j]=minid;
}
}
}
return sum;
}
int main(){
int n,a,b,val,d;
while(scanf("%d",&n)!=EOF&&n){
//memset(graph,0,sizeof(graph));
memset(lowcost,0,sizeof(lowcost));
for(int i=0;i<n*(n-1)/2;i++){
scanf("%d%d%d%d",&a,&b,&val,&d);
if(d)
graph[a][b]=graph[b][a]=0;
else
graph[a][b]=graph[b][a]=val;
}
printf("%d\n",prim(n));
}
return 0;
}