WA求助
查看原帖
WA求助
1095195
aliah楼主2024/5/9 13:20

样例过了,提交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; 
}
2024/5/9 13:20
加载中...