1 条题解
-
0
#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
- 上传者