萌新刚学NOI,程序改不出来
查看原帖
萌新刚学NOI,程序改不出来
261156
Sun_Qixuan楼主2020/8/6 23:15

萌新刚学NOI,程序漏洞百出,错误不断。

愿各位大佬出手相助。

最后加三个膜拜%%%

因为代码风格不好,所以还请各位大佬耐心看下去qwq

#include <bits/stdc++.h>

using namespace std;

struct Edge
{
	int x,y,s,kkk;
};

vector<Edge>pp[3001];

int f[3001][30],g[3001][30],dep[3001];

int max_max=0;

int max_ans=0xcf;

bool cmp(Edge x,Edge y)
{
	return x.s<y.s;
}

Edge kk[3001];int fat[1001];

int find(int x)
{
	if(x==fat[x]) return x;
	
	return fat[x]=find(fat[x]);
}

void dfs(int now)
{
	for(int i=0;i<pp[now].size();i++)
	{
		int p=pp[now][i].y;
		
		dep[p]=dep[now]+1;
		
		f[p][0]=now;g[p][0]=pp[now][i].s;
		
		for(int i=1;i<=25;i++)
		{
			f[p][i]=f[f[p][i-1]][i-1];
			
			g[p][i]=max(g[p][i-1],g[f[p][i-1]][i-1]);
		}
		
		dfs(p);
	}
}

int take_the_best(int pp1,int pp2)
{
	int ans=-0x7f;
	
	if(dep[pp1]<dep[pp2]) swap(pp1,pp2);
	
	for(int i=30;i>=0;i--)
	{
		if(dep[f[pp1][i]]>=dep[pp2])
		{
			ans=max(ans,g[pp1][i]);
			
			pp1=f[pp1][i];
		}
	}
	
	if(pp1==pp2) return ans;
	
	for(int i=30;i>=0;i--)
	{
		if(f[pp1][i]!=f[pp2][i])
		{
			ans=max(ans,max(g[pp1][i],g[pp2][i]));
			
			pp1=f[pp1][i];
			
			pp2=f[pp2][i];
		}
	}
	
	return max(ans,max(g[pp1][0],g[pp2][0]));
}

int main()
{
	int n,m;cin>>n>>m;
	
	for(int i=1;i<=m;i++)
	{
		cin>>kk[i].x>>kk[i].y>>kk[i].s;
	}
	
	sort(kk+1,kk+m+1,cmp);
	
	for(int i=1;i<=n-1;i++)
	{
		int p1=find(kk[i].x),p2=find(kk[i].y);
		
		if(fat[p1]==fat[p2])
		{
			kk[i].kkk=1;
			
			continue;
		}
		
		kk[i].kkk=0;
		
		max_max+=kk[i].s;
		
		fat[p1]=fat[p2];

		pp[kk[i].x].push_back((Edge){kk[i].x,kk[i].y,kk[i].s,});
		
		pp[kk[i].y].push_back((Edge){kk[i].y,kk[i].x,kk[i].s,});
	}
	
	dfs(1);
	
	for(int i=1;i<=n;i++)
	{
		if(kk[i].kkk==1)
		{
			max_ans=min(max_ans,max_max-take_the_best(kk[i].x,kk[i].y)+kk[i].s);
		}
	}
	
	cout<<max_ans<<endl;
}

qwqqwq求助!

2020/8/6 23:15
加载中...