20分求调(已经一个月了)
查看原帖
20分求调(已经一个月了)
988975
Owen1234楼主2024/5/23 16:52
#include <cstdio>
#include <stack>
#include <cmath>
#include <algorithm>
using namespace std;
struct Edge{
	int next;
	int to;
	int w;
	int u;
	int bh;
}es[2000005][2];
int n,m;
int head[1000005][2],cnt[2];
void add(int u,int v,int w,int b,int bh=-1){
	/*if(b==1){
		printf("%d %d %d\n",u,v,w);
	}*/
	es[cnt[b]][b].next=head[u][b];
	es[cnt[b]][b].to=v;
	es[cnt[b]][b].w=w;
	es[cnt[b]][b].u=u;
	es[cnt[b]][b].bh=bh;
	head[u][b]=cnt[b];
	cnt[b]++;
}
int par[1000005];
int find(int id){
	return id==par[id]?par[id]:par[id]=find(par[id]);
}
int fcnt;
int dfn[1000005],sjj,low[1000005],fdxx[1000005];
stack<int> sta;
stack<int> sta2;
void Tarjan(int u,int fa){
	sta.push(u);
	dfn[u]=low[u]=sjj;
	sjj++;
	for(int i=head[u][0];i;i=es[i][0].next){
		int v=es[i][0].to;
		/*if(v==fa){
			continue;
		}*/
		if(!dfn[v]){
			Tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				while(!sta2.empty()){
					sta2.pop();
				}
				while(sta.top()!=u){
					sta2.push(sta.top());
					sta.pop();
				}
				sta2.push(u);
				if(sta2.size()>=3){
					int bq=0;
					fdxx[fcnt]=sta2.size();
					while(!sta2.empty()){
						if(bq>fdxx[fcnt]/2){
							add(sta2.top(),fcnt,fdxx[fcnt]-bq,1,bq+1);
							add(fcnt,sta2.top(),fdxx[fcnt]-bq,1,bq+1);
						}
						else{
							add(sta2.top(),fcnt,bq,1,bq+1);
							add(fcnt,sta2.top(),bq,1,bq+1);
						}
						//printf("hb:%d %d\n",find(sta2.top()),find(fcnt));
						par[find(sta2.top())]=find(fcnt);
						sta2.pop();
						bq++;
					}
					fcnt++;
				}
			}
		}
		else{
			low[u]=min(low[u],dfn[v]);
		}
	}
}
int dp[1000005];
int anszj;
int hsjl(int a,int b,int fdx){
	return min(abs(a-b),fdx-abs(a-b));
}
void dfs1(int u,int fa){
	//printf("u:%d\n",u);
	for(int i=head[u][1];i;i=es[i][1].next){
		int v=es[i][1].to;
		if(v==fa){
			continue;
		}
		dfs1(v,u);
		if(u<=n){
			anszj=max(anszj,dp[u]+dp[v]+es[i][1].w);
		}
		dp[u]=max(dp[u],dp[v]+es[i][1].w);
	}
	if(u>n){
		for(int i=head[u][1];i;i=es[i][1].next){
			int v=es[i][1].to;
			if(v==fa){
				continue;
			}
			for(int j=head[u][1];j;j=es[j][1].next){
				int v1=es[j][1].to;
				if(v==v1){
					continue;
				}
				if(v1==fa){
					continue;
				}
				anszj=max(anszj,dp[v]+dp[v1]+hsjl(es[j][1].bh,es[i][1].bh,fdxx[u]));
			}
		}
	}
}
int main(){
	cnt[0]=cnt[1]=sjj=1;
	for(int i=1;i<=1000000;i++){
		par[i]=i;
	}
	scanf("%d%d",&n,&m);
	while(m--){
		int k;
		scanf("%d",&k);
		int x,y;
		scanf("%d",&x);
		for(int i=1;i<k;i++){
			scanf("%d",&y);
			add(x,y,1,0);
			add(y,x,1,0);
			x=y;
		}
	}
	fcnt=n+1;
	Tarjan(1,-1);
	//printf("t/b\n");
	for(int i=1;i<cnt[0];i++){
		int x=es[i][0].u;
		int y=es[i][0].to;
		int fx=find(x);
		int fy=find(y);
		if(fx!=fy){
			add(x,y,es[i][0].w,1);
			add(y,x,es[i][0].w,1);
			par[fx]=fy;
			/*printf("parb:");
			for(int i=1;i<fcnt;i++){
				printf("%d ",par[i]);
			}
			printf("\nhb:%d %d\n",fx,fy);*/
		}/*else{
			printf("bx\n");
		}*/
	}
	dfs1(1,-1);
	printf("%d",anszj);
	return 0;
}
2024/5/23 16:52
加载中...