题目连接:点击打开链接
最简单的最小生成树(WA了2次,对路的排序出了点错)。
#include<cstdio>
#include<algorithm>
using namespace std;
const int Max=5000;
const int N=105;
int n,m,father[N];
struct Rode
{
int a,b;
int lenth;
}rode[Max];
void Init()
{
for(int i=0;i<=n;i++)
father[i]=i;
}
bool cmp(Rode a,Rode b)
{
if(a.lenth<b.lenth) return true;
return false;
}
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
int kruscal()
{
int min=0;
sort(rode,rode+m,cmp);//这里的开始排了n条路.
for(int i=0;i<m;i++)
{
int x=find(rode[i].a);
int y=find(rode[i].b);
if(x!=y)
{
father[x]=y;
min+=rode[i].lenth;
}
}
int f=find(n),k=0;
for(int i=1;i<=n;i++)
if(find(i)==f) k++;
if(k==n) return min;
else return -1;
}
int main()
{
while(scanf("%d%d",&m,&n)&&m)
{
Init();
for(int i=0;i<m;i++)
scanf("%d%d%d",&rode[i].a,&rode[i].b,&rode[i].lenth);
int flag=kruscal();
if(flag!=-1) printf("%d\n",flag);
else printf("?\n");
}
}
又一次WA在了细节上。