人生列车

follow on!success!

导航

csu1010: Water Drinking

/*

本题的题意:

沙漠中有很多骆驼和一个池塘,0表示池塘,1-N表示骆驼,
输入的两个数表示两只骆驼,其中前面的那一头靠近池塘,
所有的骆驼队列不交叉不相连,求站在队尾但是离水井最近的骆驼编号

经过分析最后还是要先构造一个树,然后寻找离0最近的一个点,当结果是相等的级别的时候将结果返回最小的那个值

*/

参考代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define maxn 100010
 4 
 5 int pre[maxn], dis[maxn];
 6 //pre 数组代表当前骆驼的前一个骆驼, dis 数组代表当前骆驼到水井的距离
 7 int main()
 8 {
 9     int n;
10     while(scanf("%d", &n) != EOF){
11         int x, y, i, ans, mind;
12         memset(dis, 0, sizeof(dis));
13         //父节点初始化 并查集必备
14         for(i = 0; i < n; i++)
15             pre[i] = i;
16         for(i = 0; i < n; i++){
17             scanf("%d %d", &x, &y);
18             pre[y] = x;
19             dis[x] = 1;
20         }
21         for(mind = n + 1, ans = i = 0; i <= n; i++){//注意:mind的初始值要大于n
22             //如果dis[i]为0 即该节点无子节点
23             if(!dis[i]){
24                 x = i; //x 是一个临时变量
25                 //如果这个节点有父节点 递归求出距离
26                 while(pre[x] != x){
27                     x = pre[x];
28                     dis[i]++;
29                 }
30                 //找出最大距离所在的骆驼
31                 if(!x && dis[i] < mind){
32                     mind = dis[i];
33                     ans = i;
34                 }
35             }
36         }
37         printf("%d\n", ans);
38     }
39     return 0;
40 }

 

posted on 2014-08-06 16:40  tianxia2s  阅读(154)  评论(0编辑  收藏  举报