链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1863
依然最小生成树,这次是加了不能连通的判断,Prim和Kruskal,均0ms
把自己毒了,Prim的时候交换权值的时候写反了,一直WA
Prim:
#include <cstdio>
#include <climits>
#include <cstring>
using namespace std;
bool used[101];
int map[101][101];
int Prim(int n)
{
int mini,t,T=n-1,sum=0;
while(T--)
{
mini=INT_MAX;
for(int i=2; i<=n; i++)
if(!used[i] && mini>map[1][i])
{
mini=map[1][i];
t=i;
}
if(mini==INT_MAX) return -1; //判通路
used[t]=1;
sum+=mini;
for(int i=2; i<=n; i++)
if(!used[i] && map[t][i]<map[1][i])
map[1][i]=map[t][i]; //就是这里手抖写反了T T
}
return sum;
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m),n)
{
for(int i=0;i<=101;i++) for(int j=0;j<=101;j++) map[i][j]=INT_MAX;
memset(used,0,sizeof(used));
while(n--)
{
int i,j,dis;
scanf("%d %d %d",&i,&j,&dis);
if(map[i][j]>dis) map[i][j]=map[j][i]=dis; //可以不考虑重边
}
int ans=Prim(m);
printf(ans==-1 ? "?\n" : "%d\n",ans);
}
return 0;
}
Kruskal:
#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
int b,e,dis;
}s[5001];
int father[101];
bool cmp(node a,node b)
{
return a.dis<b.dis;
}
int find(int n)
{
return n==father[n] ? n : father[n]=find(father[n]);
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m),n)
{
for(int i=0;i<=m;i++) father[i]=i;
for(int i=0;i<n;i++) scanf("%d %d %d",&s[i].b,&s[i].e,&s[i].dis);
sort(s,s+n,cmp);
int sum=0;
for(int i=0;i<n;i++)
{
int x=find(s[i].b);
int y=find(s[i].e);
if(x!=y)
{
m--; //判通路
father[y]=x;
sum+=s[i].dis;
}
}
printf(m>1 ? "?\n" : "%d\n",sum);
}
return 0;
}