0
题意:
题解:先判断每条路的状态,如果是修好的,就让它们的成本是0;如果没修,就让成本给出的成本
摘要:最小生成树是为了解决一些最优解的一种手段,比如给你N个城市以及城市之间的距离,要你求出能连接所有城市的最短距离。
#include<iostream> #include<algorithm> using namespace std; int set[105]; struct node{ int x; int y; int cost; }road[10005]; //成本排序 int cmp(node a,node b){ //判断为true return a.cost<b.cost; } int find(int x){ int r=x; while(set[r]!=r) r=set[r]; return r; } int merge(int a,int b){ a=find(a); b=find(b); if(a!=b){ set[b]=a; return 1; } else return 0; } void Init_set(){ for(int i=0;i<105;i++) set[i]=i; } int main(){ int n; int m; int flag; while(cin>>n,n){ Init_set(); m=n*(n-1)/2; for(int i=0;i<m;i++){ //此题用不了cin 不知为甚 scanf("%d%d%d%d",&road[i].x,&road[i].y,&road[i].cost,&flag); //就多了这一步,注意修好的路不需要再花钱 if(flag==1) road[i].cost=0; } sort(road,road+m,cmp); int sum=0; for(int i=0;i<m;i++) if(merge(road[i].x,road[i].y)) sum+=road[i].cost; cout<<sum<<endl; } return 0; }