1. 程式人生 > 其它 >Cow Picnic S

Cow Picnic S

 

 

 解題思路: 從每頭奶牛的節點開始做搜尋,用dfs走遍所有路徑(走到底,不回頭)。每遍歷到一個節點該節點遍歷次數就加一,最後所有奶牛都搜尋完之後,檢查每個節點的遍歷次數,如果該節點的遍歷次數等於奶牛數則該節點能被所有奶牛走到。

坑:

1.每頭奶牛搜尋的時候要有清空的vis陣列記錄走沒走過該點,否則可能路徑會重複迴圈。

2.要用鄰接矩陣mp[i][j]來記錄節點的連線關係 ,其中i 是起點的編號 , j  是終點的編號, 矩陣的值為1時表示i 到 j 可以連線,0表示沒有。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
const int N=1010; 4 int k,n,m,l[N]={0},vis[N]={0},mp[N][N]={0},vis1[N]={0}; 5 void dfs(int x) 6 { 7 vis1[x]=1; 8 vis[x]++; 9 for(int i=1;i<=n;i++) 10 { 11 if(mp[x][i]==1&&vis1[i]==0) 12 { 13 dfs(i); 14 } 15 } 16 } 17 int main() 18 {
19 cin>>k>>n>>m; 20 for(int i=1;i<=k;i++) 21 { 22 scanf("%d",&l[i]); 23 } 24 for(int i=1;i<=m;i++) 25 { 26 int a1,b; 27 scanf("%d%d",&a1,&b); 28 mp[a1][b]=1; 29 } 30 for(int i=1;i<=k;i++) 31 { 32
memset(vis1,0,sizeof(vis1)); 33 dfs(l[i]); 34 } 35 int ans=0; 36 for(int i=1;i<=n;i++) 37 { 38 if(vis[i]==k) ans++; 39 } 40 cout<<ans<<endl; 41 return 0; 42 }

 

程式: