hust 1032 Jim

题目描述

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;
}

毕竟是自己写的程序,加油

时间: 2024-10-12 22:56:44

hust 1032 Jim的相关文章

hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]

传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?” 小Ho奇怪的问道:“什么叫做最长回文子串呢?” 小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串

HUST 1588 辗转数对

1588 - 辗转数对 时间限制:1秒 内存限制:128兆 155 次提交 27 次通过 题目描述 假设当前有一个数对(a, b),我们可以通过一步将这个数对变为一个新数对(a + b, b)或者是(a, a + b).初始的数对为(1, 1),你的任务是找到一个数字k,即通过最少的步数使得这个数对中至少一个数字等于n. 输入 输入包括多组数据,每组数据包括一行,每行有一个整数n. 输出 每组数据输出一行,每行一个整数n. 样例输入 5 3 样例输出 3 2 提示 第一个样例的方法是 (1,1)

HUST 1698 - 电影院 组合数学 + 分类思想

http://acm.hust.edu.cn/problem/show/1698 题目就是要把一个数n分成4段,其中中间两段一定要是奇数. 问有多少种情况. 分类, 奇数 + 奇数 + 奇数 + 奇数 奇数 + 奇数 + 奇数 + 偶数 偶数 + 奇数 + 奇数 + 奇数 偶数 + 奇数 + 奇数 + 偶数 然后奇数表达成 2 * a - 1这个样子,就能列出方程. 然后就是类似于解a1 + a2 + a3 + a4 = x的问题了. #include <cstdio> #include &l

HUST 1017 - Exact cover (Dancing Links 模板题)

1017 - Exact cover 时间限制:15秒 内存限制:128兆 自定评测 5584 次提交 2975 次通过 题目描述 There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is a selection of rows such that every column has a 1 in exactly one of the selected rows. Try to find o

勇士出征[HUST 1439]

勇士出征[HUST 1439] 时间1000ms,内存64MB 第十届"北大青鸟"杯浙江师范大学程序设计竞赛 这道题跟UVA-12100是一样的题目.我这里用的是STL的双端队列deque容器配合优先队列priority_queue,写起来会比较轻松:依次将输入压入队列,然后不断扫描队列,符合最大优先级的(优先队列的顶部元素)将其送出,而不再压入队尾.直到找到符合自己的标记的为止. 当然这道题也有用数组使用滚雪球的方式实现的,也就是开一个大的数组,每次将元素后挪时,直接将其放在数组末尾

UVALive 2659+HUST 1017+ZOJ 3209 (DLX

UVALive 2659 题目:16*16的数独.试了一发大白模板. /* * @author: Cwind */ //#pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <map> #include <algorithm> #include <cstdio> #include <cstring> #include

HUST 1341 A - A Simple Task(哈理工 亚洲区选拔赛练习赛)

A - A Simple Task Time Limit:1000MS    Memory Limit:131072KB    64bit IO Format:%lld & %llu SubmitStatusPracticeHUST 1341 Description As is known to all, lots of birds are living in HUST. A bird has s units of food on the first day, and eats k units

hust 1589 找出子串

题目描述 给定一个字符串s ,求出一个子串t,满足如下性质:1.       t是s的一个前缀.2.       t是s的一个后缀.3.       t出现在s的中间(并非前缀和后缀).例如:字符串s为fixprefixsuffix,t可以是fix.字符串s为aaa,t可以是aa.输入 输入包括多组数据,每组数据为一行,每行有一个字符串s,其长度不超过10^6(一百万). 输出 每组数据输出一行,每行为一个字符串t,若不存在字符串t,则输出"Just a legend"(不包括引号).

HUST - 1010

HUST - 1010 类比POJ 2406 自己的什么话都没有的传送门 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 typedef long long LL; 6 7 const int maxn = 1e6 + 10; 8 int next[maxn]; 9 10 void kmp(char *pattern) { 11 //int n