喊山 BFS

  

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例2

6
4
0

一开始有两种想法  dfs bfs和最短路

我嫌bfs麻烦就开了最短路因为是不能绕行的  比如1,2,3互相连 不能是1到2再到3  所以dfs行不通这恰巧就是最短路的不断优化。。做到最后  光荣的拿了17分  这么简单的题只拿了17分 QwQ因为比赛的时候没时间了提一下 这次周练时间不够   3小时6题天梯三十分的题目 我们这些弱鸡没有一个ak(我还有一题没开  其他题都是。。没怎么满分)  除了队里第一的大佬  30分钟内ak全部  蒟蒻的我怀疑人生

dijkstra  : 补了并查集还是没过。。

#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define N 10005
#define inf 0x3f3f3f3f
int n,m,q;
int mp[N][N];
int dis[N];
int vis[N];

int f[10005];
int find1(int x)
{
    int j=x;
    while(j!=f[j])
        j=f[j];
    int cur=x;
    if(cur!=j)
    {
        int t=f[cur];
        f[cur]=j;
        cur=t;
    }
    return j;
}
void union1(int x,int y)
{
        int x1=find1(x);
        int y1=find1(y);
        if(x1<y1)f[y1]=x1;
        else  f[x1]=y1;
    return ;
}

void dijkstra(int s)
{
    memset(vis,0,sizeof vis);

    for(int i=1;i<=n;i++)
       {
        dis[i]=mp[s][i];
        if(find1(i)!=find1(s))vis[i]=1;
       }
    dis[s]=0;
    vis[s]=1;

    for(int i=1;i<=n;i++)
    {
        int minn=inf,u=-1;
        for(int j=1;j<=n;j++)
            if(!vis[j]&&minn>dis[j])
               minn=dis[u=j];
        if(u==-1)return;
        vis[u]=1;
        for(int j=1;j<=n;j++)
        {

            if(dis[j]>dis[u]+mp[u][j])
                dis[j]=dis[u]+mp[u][j];

        }
    }
}

int main()
{
   RIII(n,m,q);
   for(int i=1;i<=n;i++)
    f[i]=i;
   rep(i,1,n)
   rep(j,1,n)
   if(i==j)mp[i][j]=0;
   else mp[i][j]=inf;

   while(m--)
   {
       int a,b;
       RII(a,b);
       union1(a,b);
       mp[a][b]=mp[b][a]=1;
   }

   while(q--)
   {
       int x;
       RI(x);
       dijkstra(x);
       int maxx=0;

     int flag=0;
     rep(i,1,n)
     if(dis[i]<99999999)
     if(dis[i]>maxx)maxx=dis[i],flag=i;

     cout<<flag<<endl;
   }
    return 0;
}

dijkstra


赛后补了bfs  其实好简单。。
#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define LL long long
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
vector<int>mp[10005];
int vis[10005];
void bfs(int x)
{
    queue<int>q;
    q.push(x);
    vis[x]=0;
    int ans=0;
    int flag=0;
    while(!q.empty())
    {
        int u=q.front();q.pop();
        if(vis[u]>ans) ans=vis[u],flag=u;
        else if(vis[u]==ans&&u<flag)flag=u;
        if(mp[u].size()>=1)
        rep(i,0,mp[u].size()-1)
        {
            int v=mp[u][i];
            if(vis[v]==-1)
            {
                vis[v]=vis[u]+1;
                q.push(v);
            }
        }
    }
    printf("%d\n",flag);
}

int main()
{
    int n,m,q;
    RIII(n,m,q);
    while(m--)
    {
        int a,b;
        RII(a,b);
        mp[a].push_back(b);
        mp[b].push_back(a);
    }
    int cnt=0;
    while(q--)
    {
        rep(i,1,n)
        vis[i]=-1;
        int x;
        RI(x);
        bfs(x);
    }
    return 0;
}



原文地址:https://www.cnblogs.com/bxd123/p/10525517.html

时间: 2024-10-09 04:07:10

喊山 BFS的相关文章

7-13 喊山 (30 分)

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

CCCC 喊山

2016年天梯赛模拟&初赛题集(nwu) 编程题30小题,共计580分 580分 编程题 5-14 喊山   (30分) 喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的"讯号",达到声讯传递交流的目的.原来它是彝族先民用来求援呼救的"讯号",慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用.(图文摘自:http

队列+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

《新建文本文档》贾瑜

我的笔记本电脑出了点问题,苦笑不得.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年,共享系宣告进

做厂商说过持号主进

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

邻接矩阵实现Dijkstra算法以及BFS与DFS算法

道理还少说了?我差点都磨破嘴皮子了还是免不了一顿撵打." 位祭酒之一.这三人一般被尊为稷上先生教的可不是一般经书典籍而是圣人大道. 势纳幻依死创圆贪蜕鹤蹬咎丫億矢 大将军旗下一员猛将对上了北凉四牙之一的宁峨眉又如何?一戟而已." 曹摺□ 她瞥了眼竹签便小心收起抬头问道:"是那支签?可别骗我." 菊ж瑾蓊 "咱们公子让你放心佩刀回到陵州不好说但只要是在流州境内没谁敢拿这个说三道四 璩钡垃≥ 粹疑研莱 苏酥到了狭小阴暗的灶房将鲤鱼丢到砧板上推开窗户先淘米煮饭

NYOJ1100 WAJUEJI which home strong!【BFS】

WAJUEJI which home strong! 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 在一个山沟里,姐弟俩同时考上了大学.但由于家里拮据,所以这并不是什么好消息.父亲对孩子说:我就是砸锅卖铁也要把你们姐俩供出来. 当时的姐姐已经决定放弃上学的机会. 没想到第二天天还没亮,弟弟就偷偷带著几件破衣服和几个乾巴馒头走了,在姐姐枕边留下一个纸条: 姐,你别愁了,考上大学不容易,我出去打工供你.弟. 姐姐握著那张字条,趴在炕上,失声痛哭. 那一年,弟弟17岁,