样例过了,提交1号测试点WA,后边的看不到。 我的思路:将所有的路按从短到长排序,先连接短的路,同时做并查集,如果第k条路连接的两个地方已经在互通了就不连了。最后连的那条路的长度就是需要的油箱最小值,但不知道为啥会WA 代码如下:
#include<bits/stdc++.h>
using namespace std;
struct ro
{
int from,to,s;
bool operator >(ro &x)
{
return s>x.s;
}
bool operator <(ro &x)
{
return s<x.s;
}
};
void gj(ro *a,int k,int n)
{
int i;
i=k;
if(k*2+1<n && a[k*2+1]>a[i])
i=k*2+1;
if(k*2+2<n && a[k*2+2]>a[i])
i=k*2+2;
if(i!=k)
{
ro t;
t=a[i];
a[i]=a[k];
a[k]=t;
gj(a,i,n);
}
}
int main()
{
int n,m,i,j,ans,y,z,y1,z1;
while(true)
{
cin>>n>>m;
if(n==0 && m==0)
break;
ro x[m],t;
int a[n+1];
for(i=0;i<m;i++)
{
cin>>x[i].from>>x[i].to>>x[i].s;
for(j=i;j>0 && x[j]>x[(j-1)/2];j=(j-1)/2)
{
t=x[j];
x[j]=x[(j-1)/2];
x[(j-1)/2]=t;
}
}
for(i=m-1;i>0;i--)
{
t=x[i];
x[i]=x[0];
x[0]=t;
gj(x,0,i);
}
for(i=0;i<=n;i++)
a[i]=i;
ans=0;
for(i=0;i<m;i++)
{
for(y=x[i].from;y!=a[y];y=a[y]);
for(z=x[i].to;z!=a[z];z=a[z]);
if(y!=z)
{
a[y]=a[z];
ans=x[i].s;
}
z1=0;
for(y1=x[i].from;y1!=a[y1];y1=a[y1])
{
a[z1]=y;
z1=y1;
}
z1=0;
for(y1=x[i].to;y1!=a[y1];y1=a[y1])
{
a[z1]=z;
z1=y1;
}
}
if(ans)
cout<<ans<<endl;
else
cout<<"IMPOSSIBLE"<<endl;
}
return 0;
}