题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863
Prim
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdio>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long int LL;
const int maxn=110;
struct A
{
int ed,cost;
}tmp;
int n,m;
int dis[maxn];
int vis[maxn];
vector<A> v[maxn];
int Prim()
{
memset(dis,inf,sizeof(dis));
memset(vis,0,sizeof(vis));
for(int i=0;i<v[1].size();i++)
{
dis[v[1][i].ed]=v[1][i].cost;
}
dis[1]=0;vis[1]=1;
int ans=0;
for(int l=1;l<n;l++)
{
int mini=inf;
int k=0;
for(int i=1;i<=n;i++)
{
if(dis[i]<mini&&vis[i]==0)
{
mini=dis[i];
k=i;
}
}
if(mini==inf)
return -1;
ans+=mini;
vis[k]=1;
for(int i=0;i<v[k].size();i++)
{
if(dis[v[k][i].ed]>v[k][i].cost&&vis[v[k][i].ed]==0)
dis[v[k][i].ed]=v[k][i].cost;
}
}
return ans;
}
int main()
{
while(cin>>m>>n&&m)
{
for(int i=0;i<=n;i++)
v[i].clear();
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
tmp.ed=y;
tmp.cost=z;
v[x].push_back(tmp);
tmp.ed=x;
v[y].push_back(tmp);
}
int ans=Prim();
if(ans==-1)
cout<<"?"<<endl;
else
cout<<ans<<endl;
}
return 0;
}
Kruskal
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdio>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long int LL;
const int maxn=110;
int n,m,ans,sum;
struct A
{
int st,ed;
int cost;
}a[maxn];
int f[maxn];
bool cmp(A x,A y)
{
return x.cost<y.cost;
}
int Find(int x)
{
while(x!=f[x])
x=f[x];
return f[x];
}
void Union(int x,int y,int n)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy)
{
f[fx]=fy;
ans+=a[n].cost;
sum++;
}
}
void Kruskal()
{
for(int i=1;i<=m;i++)
f[i]=i;
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
{
Union(a[i].st,a[i].ed,i);
}
if(sum<n-1)
cout<<"?"<<endl;
else
cout<<ans<<endl;
}
int main()
{
while(cin>>m>>n&&m)
{
ans=0;sum=0;
for(int i=1;i<=m;i++)
cin>>a[i].st>>a[i].ed>>a[i].cost;
Kruskal();
}
return 0;
}