对于这题,现在还是有点蒙。
不过第二题把条件转换成:若道路已修建,则费用为0 ,剩下的就是查找最小生成树的问题 瞬间思路就清晰了。
感觉还是最小生成树没有掌握好。
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int pre[105];
int cost[105];
struct node{
int s;
int e;
int w;
int f;
}nod[5000];
void make_set(int m){
int i;
for(i=1;i<=m;i++){
pre[i]=i;
cost[i]=0;
}
}
int Find(int x){
if (x != pre[x]){
pre[x] = Find(pre[x]);
}
return pre[x];
}
int Merge(int x,int y){
int a=Find(x);
int b=Find(y);
if(a==b)
return 0;
if(cost[a]>cost[b]){
pre[b]=a;
cost[a]+=cost[b];
}
else{
if(cost[a]==cost[b])
++cost[b];
pre[a]=b;
}
return 1;
}
bool cmp(node a,node b){
return a.w<b.w;
}
int main()
{
int N,i;
int ans;
while(cin>>N&&N){
for(i=0;i<N*(N-1)/2;i++){
cin>>nod[i].s>>nod[i].e>>nod[i].w>>nod[i].f;
if(nod[i].f==1)
nod[i].w=0;
}
sort(nod,nod+N*(N-1)/2,cmp);
make_set(N);
ans=0;
for(i=0;i<N*(N-1)/2;++i){
if(Merge(nod[i].s,nod[i].e)){
ans+=nod[i].w;
}
}
cout<<ans<<endl;
}
return 0;
}