zoukankan      html  css  js  c++  java
  • P2951 【[USACO09OPEN]捉迷藏Hide and Seek】

    典型的最短路,而且只要再加一点点操作,就能得到答案

    所以可以直接套模板

    具体看程序::

     1 #include<cstdio>
     2 #include<queue>//队列专属头文件
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=100005;
     6 int a[N];
     7 int n,m,l,sum,ans;
     8 int d1[N],t[N],head1[N],next1[N],w1[N],adj1[N],k1;
     9 bool f1[N];
    10 queue<int> q1;//比较喜欢定义全局变量
    11 void add(int u,int v){//加边操作,因为每条边权值为1,就不用第三个变量了
    12     next1[++k1]=head1[u];
    13     head1[u]=k1;
    14     w1[k1]=1;//如果不是1,就把一换成变量t(自己定义)
    15     adj1[k1]=v;
    16 }
    17 void spfa(int s,int e){//SPFA,最短路模板
    18     for(int i=1;i<=n;i++)
    19         d1[i]=1<<30;//赋无限大
    20     d1[s] =0;
    21     q1.push(s);
    22     f1[s]=true ;
    23     while(!q1.empty()){
    24         int top1=q1.front() ;
    25         q1.pop() ;//出队
    26         f1[top1]=false;
    27         for(int j=head1[top1];j!=0;j=next1[j]){
    28             if(d1[adj1[j]]>d1[top1]+w1[j]){//松弛操作
    29                 t[adj1[j]]++;
    30                 d1[adj1[j]]=d1[top1]+w1[j] ;
    31                 if(!f1[adj1[j]]){
    32                     q1.push(adj1[j]);
    33                     f1[adj1[j]]=true;
    34                 }
    35             }    
    36         }            
    37     }
    38 }
    39 int main(){
    40     //freopen("hideseek.in","r",stdin);
    41     //freopen("hideseek.out","w",stdout);不要在意。。。
    42     scanf("%d%d",&n,&m);//读入
    43     for(int i=1;i<=m;i++){
    44         int x,y;
    45         scanf("%d%d",&x,&y);
    46         add(x,y);
    47         add(y,x);//加边操作,因为是无向图,要加两次
    48     }
    49     spfa(1,n);//调用
    50     for(int i=1;i<=n;i++){
    51         if(d1[i]>l){//如果出现了比现在大的点,就交换
    52             l=d1[i];
    53             ans=i;
    54             sum=1;
    55         }
    56         else{
    57             if(d1[i]==l){//一样就加
    58                 sum++;
    59             }
    60         }
    61     }
    62     printf("%d %d %d
    ",ans,l,sum);//输出
    63     return 0;
    64 }

    不用数组模拟队列其实蛮麻烦的,我也只是套用模板,懒得改了,比才是现场写还是要写自己有把握的

    那个。。新人开博鼓励一下吧~~

  • 相关阅读:
    Liunx基础优化配置
    Linux配置国内的Yum源
    Liunx配置静态IP
    百度前端学院|任务七
    java的远程访问接口的实例
    java套接字实现接口访问
    Mysql的链接超时异常CommunicationsException
    mysql查看和设置timeout 和批量杀死链接进程
    springmvc接受表单多条数据的值
    jquery获取点击标签内的子标签内容和值实例
  • 原文地址:https://www.cnblogs.com/hahaha2124652975/p/11123285.html
Copyright © 2011-2022 走看看