• cogs 774. [USACO Open09] 捉迷藏


    ★☆   输入文件:hideseek.in   输出文件:hideseek.out   简单对比

    时间限制:1 s   内存限制:128 MB

    Bessie正在玩捉迷藏游戏。(捉迷藏是这样玩的:在制定了奖罚规则后,玩家分为“捉”和“藏”两种,“藏”者有多个,在他们都藏起来后,由单独的一个“捉”者去找他们,这个游戏玩起来真是其乐无穷!)

    Bessie正在盘算她要藏到哪个牛棚里,一共有N(2 <= N <= 20,000)个牛棚,编号为1~N。她知道“捉”者FJ会从1号牛棚开始找。有M(1<= M <= 50,000)条无向通路连接着所有的牛棚,其中通路i的两个端点分别为A_i和B_i(1<= A_i <= N; 1 <= B_i <= N; A_i != B_i),任意两个牛棚之间都可互达。

    Bessie觉得藏到跟1号牛棚距离最远的牛棚里会比较安全,(这里两个牛棚之间的距离是指从一个牛棚到另一个牛棚的最短路径),请帮Bessie算一下最佳躲藏位置。

    输入格式:
    第1行:两个空格隔开的整数N,M;
    第2~M+1行:第i+1行有两个整数A_i,B_i,即第i条路的两个端点;

    输出格式:
    一行,三个空格隔开的整数,分别为:离1号牛棚最远的牛棚编号(如果最远的有多个,输出编号最小的那个);最远的牛棚与1号牛棚的最短路径;拥有此最短路径的牛棚个数。

    输入输出样例:
    hideseek.in
    6 7
    3 6
    4 3
    3 2
    1 3
    1 2
    2 4
    5 2

    输入样例说明:
    输入数据如图所示:
    1--2--5
    | /|
    |/ |
    3--4
    |
    6

    hideseek.out
    4 2 3

    输出样例解释:
    4,5,6号牛棚距1号牛棚的最短路径均为2,选4号输出是因为它的编号最小。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    
    using namespace std;
    const int N=20010;
    const int M=50010;
    const int INF=9999999;
    
    int head[N],dis[N];
    bool vis[N];
    int now=1,n,m;
    struct node{
    	int u,v,w,nxt;
    }E[M<<1];
    int maxdis,cnt,number;
    
    inline int read()
    {
    	int x=0;char c=getchar();
    	while(c<'0'||c>'9')c=getchar();
    	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
    	return x;
    }
    
    inline void add(int u,int v)
    {
    	E[now].v=v;
    	E[now].w=1;
    	E[now].nxt=head[u];
    	head[u]=now++;
    }
    
    inline void spfa(int start)
    {
    	queue<int>Q;
    	for(int i=1;i<=n;i++)
    		dis[i]=INF;
    	dis[start]=0;
    	Q.push(start);
    	while(!Q.empty())
    	{
    		int topp=Q.front();
    		Q.pop();
    		vis[topp]=0;
    		for(int i=head[topp];~i;i=E[i].nxt)
    			if(dis[E[i].v]>dis[topp]+E[i].w)
    			{
    				dis[E[i].v]=dis[topp]+E[i].w;
    				if(!vis[E[i].v])
    					vis[E[i].v]=1,
    					Q.push(E[i].v);
    			}
    	}
    }
    
    int main()
    {
    	freopen("hideseek.in","r",stdin);
    	freopen("hideseek.out","w",stdout);
    	n=read(),m=read();
    	for(int i=1;i<=n;i++)
    		head[i]=-1;
    	for(int i=1;i<=m;i++)
    	{
    		int u=read(),v=read();
    		add(u,v);
    		add(v,u);
    	}
    	spfa(1);
    	for(int i=1;i<=n;i++)
    		if(dis[i]>maxdis)
    			maxdis=dis[i],
    			number=i,
    			cnt=1;
    		else 
    			if(dis[i]==maxdis)
    				cnt++;
    	printf("%d %d %d",number,maxdis,cnt);
    	return 0;
    }
    /*
    6 7
    3 6
    4 3
    3 2
    1 3
    1 2
    2 4
    5 2
    */
    

      

  • 相关阅读:
    vim 插件之NERD tree
    vim 插件之supertab
    离开页面时发送请求
    修改属性item1(1变化)
    node+express 中安装nodemon实时更新server.js
    vue封装element中table组件
    mysql常用语句
    mysql新建表
    node+express POST请求
    node+express 发送get请求
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7192657.html
Copyright © 2020-2023  润新知