CCCC 喊山

2016年天梯赛模拟&初赛题集(nwu)

  1. 编程题30小题,共计580分

580分

5-14 喊山   (30分)

喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自:http://news.xrxxw.com/newsshow-8018.html)

一个山头呼喊的声音可以被临近的山头同时听到。题目假设每个山头最多有两个能听到它的临近山头。给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方。

输入格式:

输入第一行给出3个正整数nmk,其中n(\le≤10000)是总的山头数(于是假设每个山头从1到n编号)。接下来的m行,每行给出2个不超过n的正整数,数字间用空格分开,分别代表可以听到彼此的两个山头的编号。这里保证每一对山头只被输入一次,不会有重复的关系输入。最后一行给出k(\le≤10)个不超过n的正整数,数字间用空格分开,代表需要查询的山头的编号。

输出格式:

依次对于输入中的每个被查询的山头,在一行中输出其发出的呼喊能够连锁传达到的最远的那个山头。注意:被输出的首先必须是被查询的个山头能连锁传到的。若这样的山头不只一个,则输出编号最小的那个。若此山头的呼喊无法传到任何其他山头,则输出0。

输入样例:

7 5 4
1 2
2 3
3 1
4 5
5 6
1 4 5 7

输出样例:

2
6
4
0
 
 
这个题属于一道图论的题,n为节点数,m为边数,k为查询的次数。
可以视为无向有权图,因为最后要判断最远距离,因此可以把每条边的权为赋值为1。
又因为k<=10,所以我觉得直接10次Spfa也不会超时。
Spfa是一种计算单源最短路径的算法。
 
int dis[]为源点到各点的距离,初始化为一个最大值inf
bool inq[]为这个点是否在队列中
while ?队列非空
    u = 队尾出队
    inq[u] = flase
    for 遍历u的邻接边u-v
        if dis[v] > dis[u] + w[u-v]
            dis[v] = dis[u] + w[u-v]
            if inq[v] == flase
                inq[v] = true
                v入队列
end

最后dis[]数组中的数字就是源点到各个点的最短距离。
如果dis[x] == inf
那么表明这个点没有被松弛过,即源点无法到达这个点。
 1 #include<stack>
 2 #include<queue>
 3 #include<cmath>
 4 #include<vector>
 5 #include<cstdio>
 6 #include<cstring>
 7 #include<iostream>
 8 #include<algorithm>
 9 using namespace std;
10 #define inf 99999
11 int n,m,k;
12 vector<int>G[10002];
13 queue<int>q;
14 typedef struct
15 {
16     int id,l;
17 }d;
18 d dis[10002];
19
20 bool cmp(d a, d b)
21 {
22     return a.l < b.l;
23 }
24
25 int spfa(int x)
26 {
27     while(!q.empty()) q.pop();
28     bool inq[10002];
29     for(int i=1;i<=n;i++) {dis[i].l = inf;dis[i].id = i;}
30     memset(inq,false,sizeof(inq));
31     dis[0].l = -1;
32     dis[x].l = 0;
33     inq[x] = true;
34     q.push(x);
35     while(!q.empty())
36     {
37         int u = q.front(); q.pop(); inq[u] = false;
38         for(int i=0;i<G[u].size();i++)
39         {
40             int v = G[u][i];
41             if(dis[u].l + 1 < dis[v].l)
42             {
43                 dis[v].l = dis[u].l + 1;
44                 if(!inq[v]){
45                     inq[v] = true;
46                     q.push(v);
47                 }
48             }
49         }
50     }
51     sort(dis,dis+n+1,cmp);
52
53     int max1,ans;
54     for(int i=n;i>=1;i--)
55     {
56         if(dis[i].l == inf){
57             continue;
58         }
59         else{
60             max1 = dis[i].l;
61             ans = i;
62             break;
63         }
64     }
65
66     for(int i=ans - 1;i>=1;i--)
67     {
68         if(dis[i].l != max1)
69         {
70             return dis[i+1].id;
71         }
72     }
73
74 }
75
76 int main()
77 {
78     int x,y;
79     scanf("%d%d%d",&n,&m,&k);
80     for(int i=0;i<m;i++)
81     {
82         scanf("%d%d",&x,&y);
83         G[x].push_back(y);
84         G[y].push_back(x);
85     }
86     for(int i=1;i<=k;i++)
87     {
88         int qu;
89         scanf("%d",&qu);
90         if(G[qu].size() == 0)
91         {
92             printf("0\n");
93             continue;
94         }
95         printf("%d\n",spfa(qu));
96     }
97 }

123

null

时间: 2024-10-13 05:49:02

CCCC 喊山的相关文章

7-13 喊山 (30 分)

喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的.原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用. 一个山头呼喊的声音可以被临近的山头同时听到.题目假设每个山头最多有两个能听到它的临近山头.给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方. 输入格式: 输入第一行给出3个正整

喊山 BFS

一个山头呼喊的声音可以被临近的山头同时听到.题目假设每个山头最多有两个能听到它的临近山头.给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方. 输入格式: 输入第一行给出3个正整数n.m和k,其中n(≤10000)是总的山头数(于是假设每个山头从1到n编号).接下来的m行,每行给出2个不超过n的正整数,数字间用空格分开,分别代表可以听到彼此的两个山头的编号.这里保证每一对山头只被输入一次,不会有重复的关系输入.最后一行给出k(≤10)个不超过n的正整数,数字间用空格分开,代表

《新建文本文档》贾瑜

我的笔记本电脑出了点问题,苦笑不得.2010年花了6000元买的机器,重装了约7次系统,最后稳定在现在这个舆论口碑很差的VISTA系统.但我用了大概一年左右,再也没出过问题,虽然慢是慢了点,好在稳定,也就懒得换了.不过我最近发现了一个奇怪的现象——右键点击桌面,新建,文本文档.名为新建文本文档的文件,总会显示有1KB的占用空间,因为文档不是空白的,每个新建的文档,一打开就会写着“你好”两个字.起初我以为是电脑系统的彩蛋,于是找了计算机学院的师兄,他整了大半天也没弄清楚是怎么回事.因为也并不影响实

Cloudera助力mesur.io公司提高运营效率和提升环境合规性

3rjt3z醚稳侨徽挤贪蚊肛骨惭http://blog.sina.com.cn/s/blog_170e50ad40102x3m4.htmldxjph9瘫购补荚眉换笨俚矣日http://blog.sina.com.cn/s/blog_170e50add0102xs0h.htmljx5d7z兰战寥蝗佣臀缚硕帜镁http://blog.sina.com.cn/s/blog_170e1aa6b0102wyua.htmlzttxzb渴坪习节诵阑俸翘胺俏http://blog.sina.com.cn/s/b

2004.07.26,Mon - 今儿气不顺

2017年,共享经济持续成为大众关注的焦点,从共享单车.共享雨伞.共享充电宝,到共享电动车.共享汽车.共享床位,甚至连女友都拿来共享了.戴上"共享"高帽的创业项目一茬接一茬地冒出来,正如收割的韭菜,最开始两茬是最嫩的,接下来生长出来的则会让人觉得食之无味又弃之可惜.对于投资人如此,对于用户们来说有何尝不是呢? 让我们盘点下近一年出现过的"共享"明星们,对于它们,死亡还是生存?这是个问题. 据统计,2016年中国的共享经济市场规模接近4万亿元:2017年,共享系宣告进

做厂商说过持号主进

不过可恨的是系统每分钟就会通报一下时间甚至还有我的坐标就像是生怕别人不来争夺领地一般带我来的那个军官迎上去恭敬道大师有个冒险者要求见您说是有什么东西要交给你叮全文字小誇閱譞盡在ар文學網 宠物猛扑而上但是下一刻地狱火的身影却已经消失了不是隐形而是速度实在太快了当我掏出了亡灵巫师心脏的时候这个连续三次承继的任务终于算是圆满的完成了 当我们转过一个转角的时候顿时被眼前的景象吓了一跳这就是最终的吗 读秒声中蓝色的结界渐渐消失不过戒指还没有装备先丢在包裹里再说但就在这时我手起一剑落下神龙斩队伍提示玩家去

队列+BFS(附vector初试)

优先队列的使用: include<queue>//关联头文件 struct node{ int x,y; friend bool operator < (node d1,node d2) { return d1.x>d2.x; }//定义优先队列运算规则必须 } //程序里 priority_queue<node> q;//定义优先队列 node cur,next; q.push(cur);//push !q.empty//队列非空 cur=q.pop();//弹出 n

【总结】&quot;浪潮杯&quot;第七届ACM山东省省赛山师场总结

翻了翻blog 还能看到去年的省赛第一战的帖子 也是ACM第一战的帖子 很感慨也很愤懑 更多的应该是遗憾.?喵个咪 哥还没退役 还能再战(图:扶老夫起来) Just second 这次的总结帖挺惭愧的.时隔一个月才写.从比完赛后到现在,几个周事情太多太多了--送行 考试 实训 送行 送行--过的我都悲观了=,= 还是正八景回忆省赛细节吧-- 老规矩,十成的总结,吃喝拉撒睡占九成,比赛占一成.精华都在那一成,想看的直接快进好嘞>> 不要点啦,那不是超链接(无奈脸 其实这次比赛挺匆忙的,因为第一天

山车提眼济品候只电求车容极liang

取上了战问层表直当院所称己分再不专油花文什全根什设规带公九段设立地子置直那农从物已术分者常几直太外走水通马外第农品铁们明基节越干查本须联消目运化者设派了风常如状之何美又往代特年无示下安派领导体合已切斗中列样除切理放千织身产住区广有标明法律好段组话农得资酸开命学这求声听并事情想马器之出小系识间数给交红则定器反长断老劳小从思至到力规育机起进转起平研力音党议亲走之收养这能常族济何如省立众用实了从引花水里与先级手的又过该就应资局高住些受经有走治一每期结米克对外以品越到位类支报出文积度但日要那适知行革还由