codeforces 522A A. Reposts(树形dp)
2015-08-10 19:34
267 查看
题目链接:
codeforces 522A题目大意:
给出一个谣言传播的树,问最长的链。题目分析:
水题,主要是利用map处理读入,建好树dp转移方程很简单:
dp[u]=maxv∈Childrendp[v]+1dp[u] = \max_{v \in Children}dp[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] ); } }
相关文章推荐
- 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.2 Create创建用户]
- hdoj 1513 Palindrome 【LCS】
- leetcode:LRU Cache
- C++ template
- MySQL limit用法,分页的实现。
- unity, UGUI Text fadeIn
- Hibernate学习之Transient、Persistent、Detached三种状态
- 454 Authentication failed, please open smtp flag first!
- 【笔试】12、企业发放的奖金根据利润提成。
- MyBatis学习笔记
- 弹窗插件
- 联动下拉选择菜单的实现
- C++中四种强制类型转换
- kmp模板
- 可视化的数据结构和算法
- 2.1 二进制中1的个数
- ssh Git@OSC创建远程库进行代码托管备份。
- sdut-1351-Max Sum-hdu-1003
- 简单字符串处理方法:
- 博客搬家了