首页 > 代码库 > UVA-6436 The Busiest City 树形DFS求解
UVA-6436 The Busiest City 树形DFS求解
给出n个顶点,n-1条边,对于每一个顶点来说每有一条路径经过,繁荣度+1,求最大繁荣度。
经过的含义就是这条路径使用了跟这个顶点相连的边中的的两条,任意组合都可以,所以要找出每个顶点相连的边延伸出去有多少种情况。
从第一个顶点开始建树,对于第i个节点有sum[i]个子节点,因此dp[i]=sum[i]*(n-1-sum[i]),再加上节点的n棵子树的节点数乘积/2。
#include <iostream> #include <cstdio> #include <cmath> #include <queue> #include <cstring> #include <cstdlib> #include <vector> #include <iomanip> #include <algorithm> using namespace std; const int maxn=22000; struct Edge { int v; int next; }edge[maxn<<1]; int next[maxn]; int sum[maxn]; int ans,n,num; void addedge(int u,int v) { edge[num].next=next[u]; next[u]=num; edge[num++].v=v; } void dfs(int father,int u,int N) { int v,m,temp; for(int i=next[u];i!=-1;i=edge[i].next) { v=edge[i].v; if(v==father) { continue; } dfs(u,v,N); sum[u]+=sum[v]; } m=sum[u]*(N-1-sum[u]); //cout<<father<<" "<<u<<" "<<m<<" "<<sum[u]<<endl; //cout<<"___________"<<endl; temp=0; for(int i=next[u];i!=-1;i=edge[i].next) { v=edge[i].v; if(v==father) { continue; } temp+=sum[v]*(sum[u]-sum[v]); } m+=temp/2; //cout<<father<<" "<<u<<" "<<m<<" "<<sum[u]<<endl; ans=max(ans,m); sum[u]++; } int main() { int t; int k=1; int p,q; scanf("%d",&t); while(t--) { scanf("%d",&n); num=0; memset(sum,0,sizeof(sum)); memset(next,-1,sizeof(next)); for(int i=0;i<n-1;i++) { scanf("%d%d",&p,&q); addedge(p,q); addedge(q,p); } ans=0; dfs(0,1,n); printf("Case #%d: %d\n",k++,ans); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。