刚 学 生 成 树 萌 新 求 助 (会关注的)
查看原帖
刚 学 生 成 树 萌 新 求 助 (会关注的)
91956
Dreamweaver楼主2021/2/10 21:45
#include<bits/stdc++.h>
using namespace std;
int n,mm,cnt=0;
struct edge
{
	int s,t,c;
 } ed[300010];
 struct e
 {
 	int to,cost;
 };
 vector <e> v[100010]; 
 int dep[100010],fa[100010],f[100010][22],m[100010][22];
 bool p[100010];
 int find(int p)
 {
 	
	if(fa[p]==p)	return p;
 	return fa[p]=find(fa[p]);
 }
 
 int dfs(int p,int ff,int fd)
 {
 	dep[p]=dep[ff]+1;
 	f[p][0]=ff;
 	m[p][0]=fd;
 	for(int i=1;i<=18;i++)
 	{
 		f[p][i]=f[f[p][i-1]][i-1];
		m[p][i]=max(m[p][i-1],m[f[p][i-1]][i-1]);
	}
	for(int i=0;i<v[p].size();i++)
		if(v[p][i].to!=ff)
			dfs(v[p][i].to,p,v[p][i].cost); 
 }
 int lca(int p1,int p2)
 {
 	int ans=0;
 	if(dep[p1]<dep[p2])	swap(p1,p2);
 	for(int i=20;i>=0;i--)
 		if(dep[f[p1][i]]<=dep[p2])	
 		{
 			ans=max(ans,m[p1][i]);
 			p1=f[p1][i];
		 }
	if(p1==p2)	return ans;
	for(int i=20;i>=0;i--)
	{
		if(f[p1][i]!=f[p2][i])
		{
			p1=f[p1][i],p2=f[p2][i];
			ans=max(ans,max(m[p1][i],m[p2][i]));
		}
	}
	ans= max(ans,max(m[p1][0],m[p2][0]));
	return ans;
 }
 bool cmp(edge a,edge b)
 {
 	return a.c < b.c;
 }
int main()
{
 	//freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
	cin>>n>>mm;
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=1;i<=mm;i++)
	{
		int a,b,o;
		scanf("%d%d%d",&a,&b,&o);
		ed[i].s=a;
		ed[i].t=b;
		ed[i].c=o;
		v[a].push_back((e){b,o});
		v[b].push_back((e){a,o});
	}
	int base=0;
	int u;
	sort(ed+1,ed+n+1,cmp);
	for(int i=1;i<=mm;i++)
	{
		int p1=ed[i].s;
		int p2=ed[i].t;
		p1=find(p1);
		p2=find(p2);
		if(p1!=p2)
		{
			u=ed[i].s;
			cnt++;
			base+=ed[i].c;
			p[i]=1;
			if(rand()&1)
				fa[p1]=p2;
			else
				fa[p2]=p1;
		}
		if(cnt==n-1)
			break;
	}
	cout<<base;
	dfs(u,0,0);
	int ans=9999999;
    for(int i=1;i<=mm;i++)
    {
    	if(!p[i])
    	{
    		int a=ed[i].s;
    		int b=ed[i].t;
    		ans=min(ans,ed[i].c-lca(a,b));
		}
	}
	cout<<base+ans;
	return 0;
}

第31行为什么调试显示错误啊,直接不懂

2021/2/10 21:45
加载中...