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\n",ans,l,sum);//输出
63     return 0;
64 }

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

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

posted @ 2019-07-02 21:32  喵呜,颜儿ღ  阅读(141)  评论(0编辑  收藏  举报