80分 求助
查看原帖
80分 求助
163714
Wanna_Accepted楼主2020/8/30 08:31
#include<bits/stdc++.h>
using namespace std;
const int N=600050;
const int M=600050;
const int INF=0x3f3f3f3f;
struct node1
{
	int nxt;
	int to;
	long long wei;
}ed[2*M];
long long dp[2][N][35];
int fath[N][35];
int deep[N];
struct node
{
	int x,y;
	long long z;
	bool vis;
}e[M];
bool cmp(node a,node b)
{
	return a.z<b.z;
}
int n,m;
int head[M];
int fa[M];

long long val1,val2;
int find(int x)
{
	if(fa[x]==x)return x;
	else return fa[x]=find(fa[x]);
}
int cnt;
void add(int x,int y,long long z)
{
    ed[++cnt].nxt=head[x];
	head[x]=cnt;
	ed[cnt].to=y;
	ed[cnt].wei=z;	
}
void join(int x,int y)
{
	int f1=find(x);
	int f2=find(y);
	if(f1!=f2)
	{
		fa[f1]=f2;
	}
}
long long ans;
void kk()
{
	sort(e+1,e+1+m,cmp);
	for(int i=1;i<=m;i++)
	{
		int u=find(e[i].x);
		int v=find(e[i].y);
		if(u==v)continue;
		ans+=e[i].z;
		e[i].vis=1;
		join(u,v);
		add(e[i].x,e[i].y,e[i].z);
		add(e[i].y,e[i].x,e[i].z);
	}
	//cout<<ans;
}
void bfs()
{
	deep[1]=0;
    queue<int>q;
    q.push(1);
    while(q.size())
    {
	
    	int x=q.front();
    	q.pop();
		int len=log2(deep[x]+1);
		//cout<<len;
    	for(int i=head[x];i;i=ed[i].nxt)
    	{
    		int y=ed[i].to;
    		
			//cout<<fath[y][0]<<endl;
			if(y==fath[x][0])continue;
    		fath[y][0]=x;
    		deep[y]=deep[x]+1;
    		dp[0][y][0]=ed[i].wei;
    		dp[1][y][0]=-INF;
    		q.push(y);
    		for(int t=1;t<=len;t++)
    		{
    			fath[y][t]=fath[fath[y][t-1]][t-1];
    			if(dp[0][y][t-1]!=dp[0][fath[y][t-1]][t-1])
    			{
    				dp[0][y][t]=max(dp[0][y][t-1],dp[0][fath[y][t-1]][t-1]);
    				if(dp[0][y][t-1]>dp[0][fath[y][t-1]][t-1])
    				{
    					dp[1][y][t]=max(dp[1][y][t-1],dp[0][fath[y][t-1]][t-1]);
    				}
    				else 
    				{
    					dp[1][y][t]=max(dp[0][y][t-1],dp[1][fath[y][t-1]][t-1]);
    				}
				}
				else
				{
					  dp[0][y][t]=dp[0][y][t-1];
					  if(dp[1][y][t-1]!=-INF||dp[1][fath[y][t-1]][t-1]!=-INF)dp[1][y][t]=max(dp[1][y][t-1],dp[1][fath[y][t-1]][t-1]);
				}
    		}
    	}
    }
}
void compare1(long long x)
{
	if(x>val1)
	{
		val2=val1;
		val1=x;
	 } 
	 else if(x>val2&&x!=val1)
	 {
	 	val2=x;
	 }
} 
void compare(int a,int b)
{
	compare1(dp[0][a][b]);
	compare1(dp[1][a][b]);
}

void lca(int x,int y)
{
	val1=val2=-INF;
	if(deep[y]>deep[x])
	{
		swap(x,y);
	}
	while(deep[x]>deep[y])
	{
		int t=log2(deep[x]-deep[y]);
	    compare(x,t);
	    x=fath[x][t];
	}
	if(x==y)return;
	int len1=log2(deep[x]);
	for(int i=len1;i>=0;i--)
	{
		if(fath[x][i]!=fath[y][i])
	   {
	 	   compare(x,i);
	 	   compare(y,i);
	 	   x=fath[x][i];
	 	   y=fath[y][i];
	   }
	} 
	compare(x,0);
	compare(y,0);
 
}
int main()
{
	scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%lld",&e[i].x,&e[i].y,&e[i].z);
	}
	kk();
	bfs();
	long long anss=INF;
	for(int i=1;i<=m;i++)
    {
    	//
    	if(!e[i].vis)
    	{
    		lca(e[i].x,e[i].y);
    		//cout<<val1<<val2;
    		if(val1!=e[i].z)
    		{
			    //cout<<1111;
    			anss=min(ans-val1+e[i].z,anss);
			}
			else anss=min(anss,ans-val2+e[i].z);
		}
	}
	printf("%lld",anss);
	return 0;
}
2020/8/30 08:31
加载中...