福州大学有奖月赛2015.11C题(foj 2207)以撒的结合

原创 2015年11月18日 20:23:52

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2207
比赛时这题感觉不会,赛后看了一下,其实并不是什么特别难的题目。

  • 以节点1为根节点,找出每一个节点的父亲节点,保存在数组parent[]中。
  • 对于任意两个节点,循环找出两个节点最近的根节点。(Find函数部分)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1005;
const int INF=1<<30;
struct node
{
    int v;
    node* next;
}tree[N*2],*head[N*2];
int u,v,k;
int n,m;
int test;
int parent[N];
int tmp;
bool kk[N];
int vis[N];
int sum;//统计目标房间到根节点的最少经过房间数
void init()
{
    tmp=0;
    memset(parent,0,sizeof(parent));
    memset(head,NULL,sizeof(head));
    memset(vis,0,sizeof(vis));
}
void AddEdge(int u,int v)
{
    tree[tmp].v=v;
    tree[tmp].next=head[u];
    head[u]=&tree[tmp++];
}
void dfs(int s)
{
    node* p=head[s];
    vis[s]=1;
    while(p!=NULL)
    {
        if(!vis[p->v])
        {
            dfs(p->v);
            parent[p->v]=s;
        }
        p=p->next;
    }
}
int Find(int u,int v)
{
    sum=0;
    while(parent[u]>0)
    {
        kk[u]=true;
        u=parent[u];
    }
    while(parent[v]>0)
    {
        if(kk[v])
            return v;
        v=parent[v];
        sum++;
    }
    return 1;
}
int main()
{
    cin>>test;
    for(int ii=0;ii<test;ii++)
    {
        init();
        scanf("%d%d",&n,&m);
        for(int i=1;i<n;i++)
        {
            scanf("%d%d",&u,&v);
            AddEdge(u,v);
            AddEdge(v,u);
        }
        dfs(1);//以1为根节点求出每个节点的父亲节点
        printf("Case #%d:\n",ii+1);
        for(int i=1;i<=m;i++)
        {
            for(int i=0;i<=n;i++)
                kk[i]=0;
            scanf("%d%d%d",&u,&v,&k);
            int x=Find(u,v);
            int ans1=1,ans2=0;
            bool judge=false;
            while(u!=x)
            {
                if(ans1==k)
                {
                    judge=true;
                    cout<<u<<endl;
                    break;
                }
                u=parent[u];
                ans1++;
            }
            if(judge)
                continue;
            k-=ans1;
            k=sum-k;
            while(ans2!=k)
            {
                v=parent[v];
                ans2++;
            }
            cout<<v<<endl;
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

foj Problem 2232 炉石传说 福州大学第十三届程序设计竞赛_重现 二分图

题意:有两组士兵,分别为a和b,一对一互相攻打,每个士兵的生命值等于对方的攻击值减掉自己的生命值,问能否在a组士兵全部存活的情况下,b组全部阵亡 思路:比赛时没做出来,后来听到队长说是简答的二分图...

FOJ 有奖月赛 2016-8 C Problem C Daxia & Suneast's problem

Problem Description daxia和suneast玩起来取石子游戏,现有n堆石子放成一排,每堆石子颗数为a1,a2,...,an. 然后开始m轮游戏,每轮游戏之前,suneas...
  • Mtrix
  • Mtrix
  • 2016年08月17日 18:08
  • 575

FOJ 2077 有奖月赛题

昨天比赛时浩神写的这道题,当时我想了想,大致有了个思路,只是感觉绝对会超时,所以一直没写。没想到这道题数据弱了,浩神给过了。今天来了后试着写了一下,没想到,这一写就写了快一天。。。。。悲剧。。。已经有...
  • wmn_wmn
  • wmn_wmn
  • 2012年03月26日 16:54
  • 1328

FZU Problem 2222 ABCDEFG(水题)——FOJ有奖月赛-2016年4月(校赛热身赛)

FZU Problem 2222 ABCDEFG(水题)——FOJ有奖月赛-2016年4月(校赛热身赛)

FOJ 有奖月赛 4月(校赛热身赛)D题 小茗的魔法阵

FOJ有奖月赛4月(校赛热身赛)D题小茗的魔法阵 FOJ 有奖月赛 4月(校赛热身赛)D题 小茗的魔法阵题目链接 这题不太会,不过看完大神的博客就会了 现在写下自己的理解吧/** 定义ltop[i...

福州大学第十届程序设计竞赛+Problem C 数字的孔数

Problem C 数字的孔数 Accept: 220    Submit: 253 Time Limit: 1000 mSec    Memory Limit : 32768 KB ...

2016福州大学第十三届程序设计竞赛 Problem C 平行四边形数(思维)

Problem C 平行四边形数 Accept: 82    Submit: 425 Time Limit: 2000 mSec    Memory Limit : 32768 KB ...

福州大学第十四届程序设计竞赛_重现赛 A Salty Fish(思路)

Problem A Salty Fish Accept: 108    Submit: 400 Time Limit: 1000 mSec    Memory Limit : 32768 KB ...

福州大学第十四届程序设计竞赛_重现赛

Ranklist 这场是我有史以来第一次抢到全场FB,敲开森滴^_^Pro.A Salty Fish foj2253题目链接 最大子序列和的变形,注意题干中的“至少翻转一只咸鱼”#include...

福州大学第十四届程序设计竞赛_重现赛 J - 英语考试 (最小生成树 )

在过三个礼拜,YellowStar有一场专业英语考试,因此它必须着手开始复习。 这天,YellowStar准备了n个需要背的单词,每个单词的长度均为m。 YellowSatr准备采用联想记忆法来背...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:福州大学有奖月赛2015.11C题(foj 2207)以撒的结合
举报原因:
原因补充:

(最多只允许输入30个字)