您的位置:首页 > 编程语言 > Go语言

POJ 3107 Godfather

2012-10-15 14:26 330 查看
静态链表。。STL要超时。。

View Code

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

vector<int> G[50001];
int dp[50001],visit[50001],head[50001];
int n,k;
struct Edge
{
int v;
int next;
}edge[50001 * 2];
int max(int a,int b)
{
return a > b ? a : b;
}

int min(int a,int b)
{
return a < b ? a : b;
}

void addedge(int a,int b)
{
edge[k].v = b;
edge[k].next = head[a];
head[a] = k;
k++;
}
int dfs(int u)
{
visit[u] = true;
int sum = 1,temp;
for(int i = head[u];i;i = edge[i].next)
{
int v = edge[i].v;
if(visit[v])
continue;
temp = dfs(v);
sum += temp;
dp[u] = max(dp[u],temp);
}
dp[u] = max(dp[u],n - sum);
return sum;
}

int main()
{
scanf("%d",&n);
int a,b;
memset(visit,false,sizeof(visit));
memset(dp,0,sizeof(dp));
memset(head,0,sizeof(head));
k = 1;
for(int i = 1;i <= n - 1;i++)
{
scanf("%d%d",&a,&b);
addedge(a,b);
addedge(b,a);
}
dfs(1);
int ans = 0xffffff;
for(int i = 1;i <= n;i++)
{
ans = min(ans,dp[i]);
}
bool flag = true;
for(int i = 1;i <= n;i++)
{
if(dp[i] == ans)
{
if(flag)
{
printf("%d",i);
flag = false;
}
else
{
printf(" %d",i);
}
}
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: