题目描述
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
输入
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。
当N为0时输入结束。
输出
每个测试用例的输出占一行,输出全省畅通需要的最低成本。
样例输入
4 1 2 1 1 1 3 6 0 1 4 2 1 2 3 3 0 2 4 5 0 3 4 4 0 3 1 2 1 1 2 3 2 1 1 3 1 0 0
样例输出
3 0
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXV=110;
const int INF=1000000000;
struct node{
int c,dis;
int s;
};
int n,d[MAXV],vis[MAXV];
vector<node> Adj[MAXV];
int prime(){
int ans=0;
for(int i=1;i<=n;i++){
d[i]=INF;
vis[i]=false;
}
d[1]=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=1;j<=n;j++){
if(d[j]<MIN&&vis[j]==false){
u=j;
MIN=d[j];
}
}
if(u==-1)return -1;
vis[u]=true;
ans+=d[u];
for(int j=0;j<Adj[u].size();j++){
if(d[Adj[u][j].c]>Adj[u][j].dis&&vis[Adj[u][j].c]==false){
d[Adj[u][j].c]=Adj[u][j].dis;
}
}
}
return ans;
}
int a,b,w;
int main(){
int m,s;
while(scanf("%d",&n)!=EOF&&n!=0){
int m=n*(n-1)/2;
getchar();
//printf("m = %d\n",m);
while(m--){
scanf("%d %d %d %d",&a,&b,&w,&s);
// getchar();
//Adj[a].push_back(b);
node N1,N2;
if(s==1)w=0;
N1.c=b;
N1.dis=w;
N1.s=s;
N2.s=s;
N2.c=a;
N2.dis=w;
Adj[a].push_back(N1);
Adj[b].push_back(N2);
}
int ans=prime();
if (ans!=-1)printf("%d\n",ans);
else printf("?\n");
for(int i=0;i<=n;i++)Adj[i].clear();
}
}
注:路已修则修路代价改为0;