题目链接:
题目大意:
给出一个谣言传播的树,问最长的链。
题目分析:
- 水题,主要是利用map处理读入,建好树
- dp转移方程很简单:
dp[u]=maxv∈Childrendp[v]+1
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <map>
#include <cstring>
#include <cctype>
#include <vector>
#define MAX 207
using namespace std;
vector<int> e[MAX];
map<string,int> dic;
int dp[MAX];
int n,m,b;
const string joker = "polycarp";
void add ( int u , int v )
{
e[u].push_back ( v );
e[v].push_back ( u );
}
void handle ( string&s )
{
int len = s.length();
for ( int i = 0 ; i <len ; i++ )
if ( isupper(s[i])) s[i] = (char)(s[i]+32);
}
void init ( )
{
dic.clear();
for ( int i = 0 ; i < MAX ; i++ )
e[i].clear();
n = 0;
}
void dfs ( int u , int p )
{
dp[u] = 1;
for ( int i = 0 ; i < e[u].size() ; i++ )
{
int v = e[u][i];
if ( v == p ) continue;
dfs ( v , u );
dp[u] = max ( dp[u] , dp[v]+1 );
}
}
int main ( )
{
while ( ~scanf ( "%d" , &m ))
{
init ();
string x,y,s;
int u,v;
while ( m-- )
{
cin >> x >> s >> y;
handle( x );
handle( y );
if ( !dic[x] ) dic[x] = ++n;
if ( !dic[y] ) dic[y] = ++n;
add ( dic[x] , dic[y] );
}
b = dic[joker];
dfs ( b , -1 );
printf ( "%d\n" , dp[b] );
}
}