求调,悬关
查看原帖
求调,悬关
521411
SimonLJK楼主2023/7/14 19:12

rt

#include<bits/stdc++.h>
using namespace std;
const int N=30009,M=60009;
int n,m,k;
int vis[N],sz[N],mx[N];
int s[N],sc[N],sav[N];
int rt,S,maxn,ans=0,ansmax;
int f[N],g[N];
struct edge{
	int v,w,nxt;
}edg[M*2],e[N*2];
int cntedge,hd[N];
int ncnt,nhd[N];
void add(int u,int v,int w){
	cntedge++;
	edg[cntedge]=(edge){v,w,hd[u]};
	hd[u]=cntedge;
}
void nadd(int u,int v,int w){
	ncnt++;
	e[ncnt]=(edge){v,w,nhd[u]};
	nhd[u]=ncnt;
}
struct node{
	int u,dis;
	bool operator<(const node A)const{
		return dis>A.dis;
	}
};
void dij(){
	memset(s,0x3f,sizeof(s));
	s[1]=0;
	priority_queue<node> qq;
	qq.push((node){1,0});
	node now;int u,v,w;
	while(!qq.empty()){
		now=qq.top();qq.pop();
		u=now.u;
		if(s[u]!=now.dis)
			continue;
		for(int i=hd[u];i;i=edg[i].nxt){
			v=edg[i].v;w=edg[i].w;
			if(s[v]>s[u]+w){
				s[v]=s[u]+w;
				qq.push((node){v,s[v]});
			}
		}
	}
	return;
}
int q[N],nowcnt;
void dfs(int u){
	vis[u]=1;
	int v,w,l,r;
	l=nowcnt+1;
	for(int i=hd[u];i;i=edg[i].nxt){
		v=edg[i].v;w=edg[i].w;
		if(vis[v]||s[v]!=s[u]+w)
			continue;
		nadd(u,v,w);
		nadd(v,u,w);
		q[++nowcnt]=v;
	}
	r=nowcnt;
	sort(q+l,q+r+1);
	for(int i=l;i<=r;i++)
		dfs(q[i]);
	return;
}
void getrt(int u,int fa){
	sz[u]=1;mx[u]=0;
	int v;
	for(int i=hd[u];i;i=edg[i].nxt){
		v=edg[i].v;
		if(v==fa||vis[v])
			continue; 
		getrt(v,u);
		sz[u]+=sz[v];
		mx[u]=max(mx[u],sz[v]);
	}
	mx[u]=max(mx[u],S-sz[u]);
	if(mx[u]<maxn){
		maxn=mx[u];
		rt=u;
	}
	return;
}
void dfs(int u,int fa,int diss,int cnt){
	if(cnt>k)
		return;
	int v,w;
	s[++s[0]]=diss;sc[++sc[0]]=cnt;sav[++sav[0]]=cnt;
	for(int i=hd[u];i;i=edg[i].nxt){
		v=edg[i].v;w=edg[i].w;
		if(v==fa||vis[v])
			continue;
		dfs(v,u,diss+w,cnt+1);		
	}
}
void devide(int u){
	sav[0]=sc[0]=s[0]=0;maxn=n;vis[u]=1;
	f[1]=0;g[1]=1;
	int v,w,i,j;
	for(i=hd[u];i;i=edg[i].nxt){
		v=edg[i].v;w=edg[i].w;
		if(vis[v])
			continue;
		s[0]=sc[0]=0;
		dfs(v,u,w,1);
		for(j=1;j<=s[0];j++)
			if(sc[j]<=k){
				if(f[k-sc[j]]+s[j]>ansmax){
					ansmax=f[k-sc[j]]+s[j];
					ans=g[k-sc[j]];
				}
				else if(f[k-sc[j]]+s[j]==ansmax){
					ans+=g[k-sc[j]];
				}
			}
		for(j=1;j<=s[0];j++)
			if(sc[j]<=k){
				if(s[j]>f[sc[j]+1]){
					f[sc[j]+1]=s[j];
					g[sc[j]+1]=1;
				}
				else if(s[j]==f[sc[j]+1])
					g[sc[j]+1]++;
			}
	}
	for(i=1;i<=sav[0];i++)
		if(sav[i]<=k){
			f[sav[i]+1]=f[N-1];
			g[sav[i]+1]=0;
		}
	for(i=hd[u];i;i=edg[i].nxt){
		v=edg[i].v;
		if(vis[v])
			continue;
		S=sz[v];
		getrt(v,0);
		devide(rt);
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	int u,v,w,i;
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	dij();
	dfs(1);
	cntedge=ncnt;
	memcpy(edg,e,sizeof(e));
	memcpy(hd,nhd,sizeof(nhd));
	memset(s,0,sizeof(s));
	S=maxn=n;
	memset(vis,0,sizeof(vis));
	memset(f,-0x3f,sizeof(f));
	getrt(1,0);
	devide(rt);
	printf("%d %d",ansmax,ans);
	return 0;
}
2023/7/14 19:12
加载中...