URAL 1362. Classmates 2
2014-09-04 21:37
141 查看
题意:给定一个人物关系树,以及起点,从起点开始,每人每分钟只能通知一个人,问最少多少分钟可以通知到所有人。
DFS: 对于每个点,先dfs所有相邻节点(除了调用自己的那个),得到几个答案,
然后排序,依次加上1,2,3,...答案大的加小的数字。 返回加完之后的数中的最大值。
#define FOR(i,n) for(long long (i)=1;(i)<=(n);(i)++)
#define For(i,n) for(long long (i)=0;(i)<(n);(i)++)
using namespace std;
struct ArcNode{
int to;
ArcNode*next;
};
struct Node{
int Dis;
int n;
bool vis;
ArcNode*List;
}node[100001];
void Arc(int from,int to){
ArcNode *temp=new ArcNode;
temp->to=to;
temp->next=node[from].List;
node[from].List=temp;
node[from].n++;
}
void DArc(int from,int to){
Arc(from,to);Arc(to,from);
}
int dfs(int rt){
if(node[rt].n==0) return 0;
int *ans=new int[node[rt].n];
ArcNode*temp=node[rt].List;
int n=0;node[rt].vis=1;
while(temp){
if(!node[temp->to].vis){
ans[n++]=dfs(temp->to);
}
temp=temp->next;
}
sort(ans,ans+n);int ANS=0;
for(int i=0;i<n;i++){
ans[i]+=n-i;
if(ans[i]>ANS) ANS=ans[i];
}
delete []ans;
return ANS;
}
int N;
int main(void)
{
while(cin>>N){
FOR(i,N) node[i].n=-1,node[i].vis=0,node[i].List=NULL;
FOR(i,N){
int a;
while(~scanf("%d",&a)&&a){
DArc(i,a);
}
}
int rt;scanf("%d",&rt);node[rt].n++;
int ANS=dfs(rt);
printf("%d\n",ANS);
}
return 0;
}
相关文章推荐
- URAL 1046 Geometrical dreams 用复平面
- URAL 1018. Binary Apple Tree(树形DP)
- URAL 1654 - Cipher Message
- 【解题报告】 URAL 1192 Ball in a Dream -- 物理模拟水题
- Ural 1223 & POJ 3783 鹰蛋问题
- ural 1067 && poj 1760 Disk Tree(字典树+模拟)
- 【ural】
- ural Shortest Subchain(最短路)
- URAL 1076 Trash 【最大权匹配KM快速模板O(N^3)】
- ural 1102 Strange Dialog
- URAL 1600 Airport
- ural(Timus) 1039. Anniversary Party
- ural 1910. Titan Ruins: Hidden Entrance(Titan Ruins系列题目)
- Ural 1501
- ural(Timus) 1333. Genie Bomber 2
- ural 1904(超级难读懂的题意)
- ural&nbsp;1260(找规律)
- 【后缀数组、最长回文字串】ural1297
- [Open Ural FU Personal Contest 2013]E.Pear Trees wuyiqi's method
- Ural-1044. Lucky Tickets. Easy!(简单题)