1 条题解

  • 0
    @ 2025-12-31 13:09:24
    #include<bits/stdc++.h>
    using namespace std;
    const int N=3e4+10,inf=0x3fffffff;
    int n,m,k,e,adj[N],q[N<<4],hd,tl;bool vis[N];
    struct edge{int to,next,val;}s[N<<1];
    void add(int qi,int to,int val)
    {
    	s[++e].to=to;s[e].next=adj[qi];
    	adj[qi]=e;s[e].val=val;
    }
    int totsize,root,size[N],maxs[N],maxl[N],cnt[N],dis[N],ans=-inf,tot;
    struct nd{int to,val;};vector<nd>to[N];
    bool mt(const nd &a,const nd &b){return a.to<b.to;}
    void dfs0(int rt)
    {
    	vis[rt]=1;
    	for(int i=0,l=to[rt].size();i<l;++i)
    		if(!vis[to[rt][i].to]&&dis[to[rt][i].to]==dis[rt]+to[rt][i].val)
    		{
    		 add(rt,to[rt][i].to,to[rt][i].val);
    			add(to[rt][i].to,rt,to[rt][i].val);
    			dfs0(to[rt][i].to);
    		}
    }
    void spfa_and_build()
    {
    	memset(dis,0x3f,sizeof(dis));
    	q[hd=tl=1]=vis[1]=1;dis[1]=0;
    	int i,x,l;
    	while(hd<=tl)for(x=q[hd++],vis[x]=0,i=0,l=to[x].size();i<l;++i)
    		if(dis[to[x][i].to]>dis[x]+to[x][i].val)
    		{
    			dis[to[x][i].to]=dis[x]+to[x][i].val;
    			if(!vis[to[x][i].to])vis[to[x][i].to]=1,q[++tl]=to[x][i].to;
    		}
    	dfs0(1);
    }
    void dfs1(int rt,int fa)
    {
    	size[rt]=1,maxs[rt]=0;
    	for(int i=adj[rt];i;i=s[i].next)if(!vis[s[i].to]&&s[i].to!=fa)
    		dfs1(s[i].to,rt),size[rt]+=size[s[i].to],maxs[rt]=max(maxs[rt],size[s[i].to]);
    	maxs[rt]=max(maxs[rt],totsize-size[rt]);
    	if(maxs[rt]<maxs[root])root=rt;
    }
    void dfs2(int rt,int fa,int dp)
    {
    	if(maxl[k-dp-1]!=-inf)
    	{
    		if(ans<dis[rt]+maxl[k-dp-1])ans=dis[rt]+maxl[k-dp-1],tot=cnt[k-dp-1];
    		else if(ans==dis[rt]+maxl[k-dp-1])tot+=cnt[k-dp-1];
    	}
    	if(dp+1<k)for(int i=adj[rt];i;i=s[i].next)if(!vis[s[i].to]&&s[i].to!=fa)
    		dis[s[i].to]=dis[rt]+s[i].val,dfs2(s[i].to,rt,dp+1);
    }
    void update(int rt,int fa,int dp)
    {
    	if(maxl[dp]<dis[rt])maxl[dp]=dis[rt],cnt[dp]=1;
    	else if(maxl[dp]==dis[rt])++cnt[dp];
    	if(dp+1<k)for(int i=adj[rt];i;i=s[i].next)
    		if(!vis[s[i].to]&&s[i].to!=fa)update(s[i].to,rt,dp+1);
    }
    void solve(int rt)
    {
    	vis[rt]=1,maxl[0]=0,cnt[0]=1;
    	for(int i=adj[rt];i;i=s[i].next)if(!vis[s[i].to])
    		dis[s[i].to]=s[i].val,dfs2(s[i].to,0,1),update(s[i].to,0,1);
    	for(int i=1;i<=k;++i)maxl[i]=-inf,cnt[i]=0;
    	for(int i=adj[rt];i;i=s[i].next)if(!vis[s[i].to]&&size[s[i].to]>=k)
    		root=0,totsize=size[s[i].to],dfs1(s[i].to,0),solve(root);
    }
    void work_and_print()
    {
    	memset(vis,0,sizeof(vis)),memset(dis,0,sizeof(dis)),memset(cnt,0,sizeof(cnt));
    	for(int i=1;i<=k;++i)maxl[i]=-inf;
    	totsize=n,root=0,maxs[0]=inf,dfs1(1,0),solve(root);
    	printf("%d %d",ans,tot);
    }
    int main()
    {
    	scanf("%d%d%d",&n,&m,&k);
    	for(int i=1,a,b,w;i<=m;i++)
    	{
    		scanf("%d%d%d",&a,&b,&w);
    		to[a].push_back({b,w});
    		to[b].push_back({a,w});
    	}
    	for(int i=1;i<=n;i++)sort(to[i].begin(),to[i].end(),mt);
    	spfa_and_build();work_and_print();
    }
    
    • 1

    信息

    ID
    5681
    时间
    5000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    5
    已通过
    2
    上传者