2017-12-10
很简单的一道最小生成树算法题,直接运用prime算法求解即可,代码还有需要优化的地方.
#include<iostream>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 100;
int dis[N+1][N+1];
bool f[N+1];
int m,n;
int prime(){
int s=0;
f[1]=true;
for (int i=1;i<m;i++){
int min=0x3f3f3f3f,pos=1;
for (int j=1;j<=m;j++){
if (f[j]){
for (int k=1;k<=m;k++){
if (!f[k]&&j!=k){
if (dis[j][k]<min){
min=dis[j][k];
pos=k;
}
}
}
}
}
f[pos]=true;
s+=min;
}
return s;
}
int main(){
while (cin>>n>>m){
memset(dis,0x3f,sizeof(dis));
memset(f,false,sizeof(f));
if (n==0) break;
for (int i=0;i<n;i++){
int a,b,d;
cin>>a>>b>>d;
dis[a][b]=d;
dis[b][a]=d;
}
int i,res=prime();
for (i=1;i<=m;i++){
if (!f[i]){
break;
}
}
if (i<=m) cout<<"?"<<endl;
else cout<<res<<endl;
}
return 0;
}