50pts.WA on #2 #5 #6 #7 #9
查看原帖
50pts.WA on #2 #5 #6 #7 #9
786957
YDHJ楼主2023/8/14 20:52

只有50pts.
WA on #2 #5 #6 #7 #9
求助啊啊啊啊啊, 有没有dalao能看出哪里错了。。
感觉和城市环路蛮像的?

代码:

#include<bits/stdc++.h>
#define maxm 5000010
#define maxn 5000010
using namespace std;
int n;
struct EDGE
{
	int v;
	int nxt;
}edge[maxm];
int head[maxn],totedge=1;
void addedge(int u,int v)
{
	totedge++;
	edge[totedge].v=v;
	edge[totedge].nxt=head[u];
	head[u]=totedge;
}
struct NODE
{
	bool inr;
	int val;
}tree[maxn];
int vir[maxn];
vector<int>r;
int findr(int p,int fa)
{
	vir[p]=p;
	for(int i=head[p];i;i=edge[i].nxt)
	{
		int v=edge[i].v;
		if(v==fa)continue;
		if(vir[v])
		{
			r.push_back(p);
			tree[p].inr=true;
			return vir[v];
		}
		else
		{
			int tmp=findr(v,p);
			if(tmp)
			{
				r.push_back(p);
				tree[p].inr=true;
				if(p==tmp)
					return false;
				return tmp;
			}
		}
	}
	return false;
}
bool vis[maxn];
void dfs(int p)
{
	vis[p]=1;
	for(int i=head[p];i;i=edge[i].nxt)
	{
		int v=edge[i].v;
		if(vis[v])continue;
		dfs(v);
	}
}
int f1[maxn][2];
void dp(int p,int fa)
{
	f1[p][1]=tree[p].val;
	for(int i=head[p];i;i=edge[i].nxt)
	{
		int v=edge[i].v;
		if(v==fa||tree[v].inr)
			continue;
		dp(v,p);
		f1[p][0]+=max(f1[v][0],f1[v][1]);
		f1[p][1]+=f1[v][0];
	}
}
int f2[maxn][2];
int ans=0;
int res=0;
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int w,v;
		cin>>tree[i].val>>v;
		addedge(i,v);
		addedge(v,i);
	}
	for(int i=1;i<=n;i++)
	{
		int res=0;
		if(vis[i])continue;
		findr(i,0);
		dfs(i);
		int l=r.size();
		for(int i=0;i<l;i++)
			dp(r[i],0);
		f2[0][0]=f1[r[0]][0];
		f2[0][1]=0;
		for(int i=1;i<l;i++)
		{
			f2[i][0]=max(f2[i-1][0],f2[i-1][1])+f1[r[i]][0];
			f2[i][1]=f2[i-1][0]+f1[r[i]][1];
		}
		res=max(res,max(f2[l-1][1],f2[l-1][0]));
		memset(f2,0,sizeof(f2));
		f2[0][0]=0;
		f2[0][1]=f1[r[0]][1];
		for(int i=1;i<l;i++)
		{
			f2[i][0]=max(f2[i-1][0],f2[i-1][1])+f1[r[i]][0];
			f2[i][1]=f2[i-1][0]+f1[r[i]][1];
		}
		ans+=max(res,f2[l-1][0]);
		r.clear();
		memset(f2,0,sizeof(f2));
	}
	cout<<ans<<"\n";
	return 0;
}
2023/8/14 20:52
加载中...