题目描述
Jim is boss of a big company . There are so many workers in his company that
it will take a long time for his command send to all of his workers . One day he
want to know how long it will take at least . So he ask you , one of his best
programer , to solve the problem . All the workers in Jim‘s conpany will receive
command from only one people . So there is a tree (the root is Jim) identify the
order Jim‘s command will send by . One send command to another will cost 1
minute and anyone can‘t send command to more than one people at the same time
.
输入
There will be multiple cases in the input . For each case there will be just
one number N (N<=10000) in the first line , then N-1 fellowed , each line
with two names: worker1 worker2 , that is to say worker2 send command to worker1
. The name of the workers will only contain characters and the length is at most
5 .
输出
Just one number to tell how many minutes it will cost at least .
样例输入
5
Tom Jim
Bob Jim
John Tom
Mily Tom
样例输出
3
唉!这个题一直做错,最后是在厚着脸皮问了学长,结果被学长狂虐了,树形dp,膜拜大神他们啊
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
using namespace std;vector<int>tree[10001];
map<string,int>people;
typedef map<string,int>::iterator Itr;
Itr itr;
int nowmax;
bool vis[10001];
bool cmp(int x,int y){return x>y;}int dfs(int u)
{
int a[10001];
int sum=tree[u].size();
if (sum==0) return 0;
int ans=0,k=0;
for (int i=0;i<tree[u].size();i++)
{
int v=tree[u][i];
if (!vis[v])
{
vis[v]=true;
a[++k]=dfs(v);
}
}
sort(a+1,a+sum+1,cmp);
for (int i=1;i<=sum;i++)
ans=max(ans,a[i]+i);
return ans;
}int main()
{
int n,m;
string str1,str2;
m=0;
while (scanf("%d",&n)!=EOF)
{
if (n==1)
{
cout<<"0"<<endl;
continue;
}
for (int i=0;i<=n;i++) tree[i].clear();
m=0;
people.clear();
for (int i=1;i<=n-1;i++)
{
cin>>str1>>str2;
if(people.count(str1)==0)
{
people[str1]=++m;
if (people.count(str2)==0)
{
people[str2]=++m;
tree[m].push_back(m-1);
}
else tree[people[str2]].push_back(m);
}
else
{
if (people.count(str2)==0)
{
people[str2]=++m;
tree[m].push_back(people[str1]);
}
else tree[people[str2]].push_back(people[str1]);
}
}
int u=people["Jim"];
memset(vis,0,sizeof(vis));
vis[u]=true;
cout<<dfs(u)<<endl;
}
return 0;
}
毕竟是自己写的程序,加油