求助,WA#4和#10
查看原帖
求助,WA#4和#10
108613
JinTianHao楼主2021/4/8 21:13

目前目测过两遍程序,应该没有什么低级问题 可能是实现的思路有些问题,求大佬指点

#include <bits/stdc++.h>
#define inf 9223372036854775807LL
#define mod 1000000007
//#pragma GCC optimize(2)
#define int long long
using namespace std;
template <typename T> void read(T &x){
	x=0;char ch=getchar();int fh=1;
	while (ch<'0'||ch>'9'){if (ch=='-')fh=-1;ch=getchar();}
	while (ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	x*=fh;
}
template <typename T> void write(T x) {
	if (x<0) x=-x,putchar('-');
	if (x>9) write(x/10);
	putchar(x%10+'0');
}
template <typename T> void writeln(T x) {
	write(x);
	puts("");
}
int n,m;
long long sum=0,ans=inf;
pair<pair<int,int>,pair<int,int> > edge[300005];
int pre[100005];
int h[100005],e[600005],w[600005],ne[600005],idx;
bool tree[600005];
int depth[100005],fa[100005][18],dp[100005][18][2];
void add(int x,int y,int z)
{
	e[idx]=y,w[idx]=z,ne[idx]=h[x],h[x]=idx++;
	e[idx]=x,w[idx]=z,ne[idx]=h[y],h[y]=idx++;
}
int fnd(int x)
{
	if(pre[x]!=x) pre[x]=fnd(pre[x]);
	return pre[x];
}
void kruskal()
{
	sort(edge+1,edge+m+1);
	for(int i=1;i<=n;++i)
		pre[i]=i;
	for(int i=1;i<=m;++i)
	{
		int fx=fnd(edge[i].second.first),fy=fnd(edge[i].second.second);
		if(fx!=fy)
		{
			pre[fx]=fy;
			sum+=edge[i].first.first;
			tree[edge[i].first.second*2]=tree[edge[i].first.second*2+1]=1;
		}
	}
}
void bfs()
{
	for(int i=0;i<=n;++i)
	{
		depth[i]=inf;
		for(int k=0;k<=17;++k)
			dp[i][k][0]=dp[i][k][1]=-inf;
	}
	depth[0]=0,depth[1]=1;
	queue<int> q;
	q.push(1);
	while(!q.empty())
	{
		int t=q.front();
		q.pop();
		for(int i=h[t];~i;i=ne[i])
		{
			int j=e[i];
			if(depth[j]>depth[t]+1&&tree[i])
			{
				depth[j]=depth[t]+1;
				q.push(j);
				fa[j][0]=t;
				dp[j][0][0]=w[i];
				for(int k=1;k<=17;++k)
					fa[j][k]=fa[fa[j][k-1]][k-1];
			}
		}
	}
	for(int k=1;k<=17;++k)
	{
		for(int i=1;i<=n;++i)
		{
			if(dp[i][k-1][0]>dp[i][k][0])
			{
				dp[i][k][1]=dp[i][k][0];
				dp[i][k][0]=dp[i][k-1][0];
			}
			else if(dp[i][k-1][0]!=dp[i][k][0]&&dp[i][k-1][0]>dp[i][k][1])
				dp[i][k][1]=dp[i][k-1][0];
			if(dp[i][k-1][1]>dp[i][k][0])
			{
				dp[i][k][1]=dp[i][k][0];
				dp[i][k][0]=dp[i][k-1][1];
			}
			else if(dp[i][k-1][1]!=dp[i][k][0]&&dp[i][k-1][1]>dp[i][k][1])
				dp[i][k][1]=dp[i][k-1][1];
			if(dp[fa[i][k-1]][k-1][0]>dp[i][k][0])
			{
				dp[i][k][1]=dp[i][k][0];
				dp[i][k][0]=dp[fa[i][k-1]][k-1][0];
			}
			else if(dp[fa[i][k-1]][k-1][0]!=dp[i][k][0]&&dp[fa[i][k-1]][k-1][0]>dp[i][k][1])
				dp[i][k][1]=dp[fa[i][k-1]][k-1][0];
			if(dp[fa[i][k-1]][k-1][1]>dp[i][k][0])
			{
				dp[i][k][1]=dp[i][k][0];
				dp[i][k][0]=dp[fa[i][k-1]][k-1][1];
			}
			else if(dp[fa[i][k-1]][k-1][1]!=dp[i][k][0]&&dp[fa[i][k-1]][k-1][1]>dp[i][k][1])
				dp[i][k][1]=dp[fa[i][k-1]][k-1][1];
		}
	}
}
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	read(n);read(m);
	memset(h,-1,sizeof(h));
	for(int i=1;i<=m;++i)
	{
		int x,y,z;
		read(x);read(y);read(z);
		add(x,y,z);
		edge[i]=make_pair(make_pair(z,i-1),make_pair(x,y));
	}
	kruskal();
	bfs();
	for(int i=1;i<=m;++i)
		if(!tree[edge[i].first.second*2])
		{
			int a=edge[i].second.first,b=edge[i].second.second;
			if(a==b) continue;
			int max1=-inf,max2=-inf;
			if(depth[a]<depth[b]) swap(a,b);
			for(int k=17;k>=0;--k)
				if(depth[fa[a][k]]>depth[b])
				{
					if(dp[a][k][0]>max1)
					{
						max2=max1;
						max1=dp[a][k][0];
					}
					else if(dp[a][k][0]!=max1&&dp[a][k][0]>max2)
						max2=dp[a][k][0];
					if(dp[a][k][1]>max1)
					{
						max2=max1;
						max1=dp[a][k][1];
					}
					else if(dp[a][k][1]!=max1&&dp[a][k][1]>max2)
						max2=dp[a][k][1];
					a=fa[a][k];
				}
			if(a!=b)
			{
				for(int k=17;k>=0;--k)
					if(fa[a][k]!=fa[b][k])
					{
						if(dp[a][k][0]>max1)
						{
							max2=max1;
							max1=dp[a][k][0];
						}
						else if(dp[a][k][0]!=max1&&dp[a][k][0]>max2)
							max2=dp[a][k][0];
						if(dp[a][k][1]>max1)
						{
							max2=max1;
							max1=dp[a][k][1];
						}
						else if(dp[a][k][1]!=max1&&dp[a][k][1]>max2)
							max2=dp[a][k][1];
						a=fa[a][k];
						if(dp[b][k][0]>max1)
						{
							max2=max1;
							max1=dp[b][k][0];
						}
						else if(dp[b][k][0]!=max1&&dp[b][k][0]>max2)
							max2=dp[b][k][0];
						if(dp[b][k][1]>max1)
						{
							max2=max1;
							max1=dp[b][k][1];
						}
						else if(dp[b][k][1]!=max1&&dp[b][k][1]>max2)
							max2=dp[b][k][1];
						b=fa[b][k];
					}
				if(dp[a][0][0]>max1)
				{
					max2=max1;
					max1=dp[a][0][0];
				}
				else if(dp[a][0][0]!=max1&&dp[a][0][0]>max2)
					max2=dp[a][0][0];
				if(dp[a][0][1]>max1)
				{
					max2=max1;
					max1=dp[a][0][1];
				}
				else if(dp[a][0][1]!=max1&&dp[a][0][1]>max2)
					max2=dp[a][0][1];
				a=fa[a][0];
				if(dp[b][0][0]>max1)
				{
					max2=max1;
					max1=dp[b][0][0];
				}
				else if(dp[b][0][0]!=max1&&dp[b][0][0]>max2)
					max2=dp[b][0][0];
				if(dp[b][0][1]>max1)
				{
					max2=max1;
					max1=dp[b][0][1];
				}
				else if(dp[b][0][1]!=max1&&dp[b][0][1]>max2)
					max2=dp[b][0][1];
				b=fa[b][0];
			}
			if(max1>-inf&&max1!=w[edge[i].first.second*2])
				ans=min(ans,sum-max1+w[edge[i].first.second*2]);
			else if(max2>-inf&&max2!=w[edge[i].first.second*2])
				ans=min(ans,sum-max2+w[edge[i].first.second*2]);
		}
	writeln(ans);
	return 0;
}
2021/4/8 21:13
加载中...