WA的不知所错时,可以重写一遍,比检查快的多。
注意考虑极限情况,这题中n<10^5,所以n可能等于1。辣鸡错误毁我青春
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxl 100100
using namespace std;
int n,m,sum;
long long ans;
int f[maxl];
struct ed{int x,y,l;} e[maxl];
bool yes;
bool cmp(const ed &x,const ed &y)
{
return x.l<y.l;
}
void prework()
{
ed d;
for(int i=0;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].l);
sort(e+1,e+1+m,cmp);
}
int find(int x)
{
if(f[x]!=x)
f[x]=find(f[x]);
return f[x];
}
void mainwork()
{
int x,y;sum=0;ans=0;yes=false;
for(int i=1;i<=m;i++)
{
x=find(e[i].x);y=find(e[i].y);
if(x!=y)
{
f[y]=x;sum++;ans+=e[i].l;
if(sum==n-1)
{
yes=true;
break;
}
}
}//n=1不会进这里
}
void print()
{
if(yes || n==1)
printf("%lld\n\n",ans);
else
printf("impossible\n\n");
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
prework();
mainwork();
print();
}
return 0;
}