sicily 1155 Can I Post the letter

题意:判断有向图两点之间是否可通达!

解法:深搜或广搜(注意避免旧路重行)

  

   DFS:

 1 #include<iostream>

 2 #include<vector>

 3 #include<string.h>

 4 using namespace std;

 5 

 6 struct Road{

 7     int From;

 8     int Dest;

 9     bool Vist;

10     Road(int f,int d,bool v){

11         From = f;

12         Dest = d;

13         Vist = v;

14     }

15 };

16 vector<Road> roads[20001];

17 bool reach=false;

18 int N,M;

19 

20 void dfs(int n){

21     if(n == N-1){

22         reach = true;

23         return;

24     }

25     for(int i=0;i<roads[n].size();i++){

26         if(roads[n][i].Vist && roads[n][i].Dest !=0){

27             int gonext =roads[n][i].Dest;

28             //use to avoid repeat search

29             roads[n][i].Vist = false;    

30             dfs(gonext);

31         }

32     }

33 }

34 int main(){

35     while(cin>>N && N>0){

36         cin>>M;

37         reach = false;

38         memset(roads,0,sizeof(roads));

39         int from,dest;

40         bool exist = true;

41         for(int i=0;i<M;i++){

42             cin >> from>>dest;

43             Road r = Road(from,dest,exist);

44             roads[from].push_back(r);

45         }

46         //deep search

47         dfs(0);

48         if(reach){

49             cout<<"I can post the letter"<<endl;

50         }

51         else{

52             cout<<"I can't post the letter"<<endl;

53         }

54     }

55     return 0;

56 }

       BFS:

 1 #include<iostream>

 2 #include<string.h>

 3 #include<queue>

 4 using namespace std;

 5 

 6 int N,M;

 7 int roads[201][201];

 8 bool visited[200001];

 9 

10 int main(){

11     while(cin>>N && N>0){

12         cin>>M;

13         memset(roads,0,sizeof(roads));

14         memset(visited,false,sizeof(visited));

15         int from=0,dest=0;

16         for(int i=0;i<M;i++){

17             cin >> from>>dest;

18             roads[from][dest] = 1;

19         }

20         //breadth-first search

21         queue<int> que;

22         que.push(0);

23         int i;

24         while(!que.empty() && visited[N-1] !=true){

25             i = que.front();

26             for(int j=0;j<N;j++){

27                 if(roads[i][j] == 1 && visited[j] == false)

28                 {

29                     visited[j] = true;

30                     que.push(j);

31                 }

32             }

33             que.pop();

34         }

35         if(visited[N-1] == true){

36             cout<<"I can post the letter"<<endl;

37         }

38         else{

39             cout<<"I can't post the letter"<<endl;

40         }

41     }

42     return 0;

43 }

 

 

你可能感兴趣的:(post)