P2951 【[USACO09OPEN]捉迷藏Hide and Seek】

典型的最短路,並且只要再加一點點操做,就能獲得答案數組

因此能夠直接套模板ide

具體看程序::spa

 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 }

不用數組模擬隊列其實蠻麻煩的,我也只是套用模板,懶得改了,比才是現場寫仍是要寫本身有把握的code

那個。。新人開博鼓勵一下吧~~blog

相關文章
相關標籤/搜索