Bad Cowtractors
pku 2377:http://acm.pku.edu.cn/JudgeOnline/problem?id=2377
很基础的一道题,输入N和M,表示有N个结点和M条路径,求这个图的最大生成树。
题目意思很明显了,但是注意有重边的情况,此时应该输出权较大的结果,当不能连通时输出-1。
-
#include<iostream>
-
using namespace std;
-
int n;
-
int edge[1005][1005];
-
bool visit[1005];
-
int sum;
-
-
void prim(){
-
int i,j,k;
-
int lowcost[1005];
-
for (i=0;i<n;i++){
-
lowcost[i]=edge[0][i];
-
}
-
visit[0]=true;
-
for (i=1;i<n;i++){
-
j=0;
-
while (visit[j]) j++;
-
for (k=0;k<n;k++)
-
if ((!visit[k])&&(lowcost[k]>lowcost[j])) j=k;
-
if(lowcost[j]==0)break;
-
sum += lowcost[j];
-
visit[j]=true;
-
for (k=0;k<n;k++)
-
if (!visit[k]&&(edge[j][k]>lowcost[k])){
-
lowcost[k]=edge[j][k];
-
}
-
}
-
}
-
-
int main(){
-
int m;
-
cin>>n>>m;
-
int i,j,t;
-
bool flag = true;
-
for(i=0;i<n;i++){
-
visit[i]=false;
-
for(j=0;j<n;j++){
-
edge[i][j]=0;
-
}
-
}
-
while(m--){
-
cin>>i>>j>>t;
-
if(t>edge[i-1][j-1]){
-
edge[i-1][j-1]=edge[j-1][i-1]=t;
-
}
-
}
-
prim();
-
for(i=1;i<n;i++){
-
if(!visit[i]){
-
cout<<-1<<endl;
-
flag = false;
-
break;
-
}
-
}
-
if(flag)cout<<sum<<endl;
-
return 0;
-
}