灭绝树求助Orz
查看原帖
灭绝树求助Orz
214728
剑雪清寒楼主2022/8/19 20:41

样例可以过,但是WA咧,球球帮忙看看

#include <bits/stdc++.h>
using namespace std;
inline long long read() {
	long long x;bool f;char ch;
	for(f=0;!isdigit(ch=getchar());f=ch=='-');
	for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
	return f?-x:x; 
}
inline void print(long long x,char las) {
	if(!x) {
		putchar('0'),putchar(las);
		return ;
	}
	if(x<0) putchar('-'),x=-x;
	int ls[23],k=0;
	while(x) ls[++k]=x%10,x/=10;
	while(k) putchar(ls[k--]+48);
	putchar(las);
	return ;
}
struct edge {
	int to,len;
	edge *next; 
};
struct gra {
	int rs;
	edge rd[600000],*head[200001];
	inline void add(int u,int v,int l) {
		rd[rs].to=v;rd[rs].len=l;rd[rs].next=head[u];head[u]=&rd[rs++];
	}
}gg;
struct graph {
	int rs;
	edge rd[300000],*head[200001];
	inline void add(int u,int v) {
		rd[rs].to=v;rd[rs].next=head[u];head[u]=&rd[rs++];
	}
}g1,g2,g3;
struct node {
	int name;long long dis=LLONG_MAX;
	inline bool operator<(const node &ls) const {
		return dis>ls.dis;
	}
}nd[200001];
int n=read(),m=read(),s=read(),line[200001],h,t,du[200001],f[20][200001],deep[200001],ans,mx;
priority_queue<node>q1;
bitset<200001>us;
inline int LCA(int u,int v) {
	if(deep[u]<deep[v]) swap(u,v);
	for(int i=19;i>=0;i--) if(deep[f[i][u]]>=deep[v]) u=f[i][u];
	if(u==v) return u;
	for(int i=19;i>=0;i--) if(f[i][u]!=f[i][v]) u=f[i][u],v=f[i][v];
	return f[0][u];
}
inline int find(int x) {
	int res=1;
	for(edge *i=g3.head[x];i;i=i->next) res+=find(i->to);
	if(res>mx && x!=s) mx=res,ans=x;
	return res;
}
int main() {
	for(int i=1;i<=m;i++) {
		int u=read(),v=read(),l=read();
		gg.add(u,v,l);gg.add(v,u,l);
	}
	nd[s].name=s;
	nd[s].dis=0;q1.push(nd[s]);
	while(!q1.empty()) {
		node now=q1.top();q1.pop();
		if(us[now.name]) continue;
		us[now.name]=1;
		for(edge *i=gg.head[now.name];i;i=i->next) {
			if(us[i->to]) continue;
			if(i->len+now.dis<nd[i->to].dis) nd[i->to].name=i->to,nd[i->to].dis=i->len+now.dis,q1.push(nd[i->to]);
		}
	}
	line[++t]=s;
	while(h<t) {
		int now=line[++h];
		for(edge *i=gg.head[now];i;i=i->next) {
			if(i->len+nd[now].dis==nd[i->to].dis) {
				g1.add(i->to,now),g2.add(now,i->to),du[i->to]++;
				line[++t]=i->to;
			}
		}
	}
	h=t=0;
	for(int i=1;i<=n;i++) if(!du[i]) line[++t]=i;
	while(h<t) {
		int now=line[++h],lca=0;bool k=false;
		for(edge *i=g1.head[now];i;i=i->next)
			if(!k) lca=i->to,k=true;
			else lca=LCA(lca,i->to);
		g3.add(lca,now);
		f[0][now]=lca;deep[now]=deep[lca]+1;
		for(int i=1;i<20;i++) f[i][now]=f[i-1][f[i-1][now]];
		for(edge *i=g2.head[now];i;i=i->next) if(--du[i->to]==0) line[++t]=i->to;
	}
	find(s);
	print(ans,'\n');
	return 0;
}


2022/8/19 20:41
加载中...