题目链接:http://codeforces.com/problemset/problem/522/A
题意:给定一系列的字符串,然后用这些字符串相连接,找一下最长能够连多长(前一个字符串的第三个单词和下一个字符串的第一个单词相等的时候可以连接,字符串中的大写和小写是一样对待的)!
//codeforces 522A Reposts,找最长链长度dp[x]
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <map>
#include <cstring>
#include <cctype>
#include <vector>
#define maxn 207
using namespace std;
vector<int >vec[maxn];
map<string, int>dic;
int dp[maxn];//dp[u] = m表示以u为头的最长链的长度
int n, m, b;
const string joker = "polycarp";
//把u压入v的优先队列,把v压入u的优先队列
void add(int u, int v)
{
vec[u].push_back(v);
vec[v].push_back(u);
}
//大写转换为小写
void change(string &s)
{
int len = s.length();
for (int i = 0; i < len; i++)
if (isupper(s[i]))
s[i] = towlower(s[i]);
}
void init()
{
dic.clear();
for (int i = 0; i < maxn; i++)
vec[i].clear();
n = 0;
}
void dfs(int u, int p)
{
dp[u] = 1;
for (int i = 0; i < vec[u].size(); i++) {
int v = vec[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;
change(x), change(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]);
}
}