寻找道路——稍坑的搜索水题

  先从反向图搜一遍,谁都能想出来。我第一次反向搜用的dfs 超时。果断重打改成bfs,然而在二次判断某个点到底能不能经过的时候出错,调了蛮久。

  刚开始时我直觉是这样的(复制自改成bfs 后第一次错误代码):

1     for(int i=1;i<=n;i++)
2         if(in[i])
3             for(int j=0;j<gr[i].size();j++)
4                 if(!in[gr[i][j]]){
5                     in[i]=false;
6                     break;
7                 }
Block_01

  后来新加了个数组avail 单独构造可行点。是这样的(同最终代码):

1     for(int i=1;i<=n;i++)
2         if(in[i]){
3             bool con=false;
4             for(int j=0;j<gr[i].size()&&!con;j++)
5                 if(!in[gr[i][j]])
6                     con=true;
7             if(!con)avail[i]=true;
8         }
9     avail[tx]=true;
Block_02

  所以最终版本如下:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 using namespace std;
 6 const int N=10086;
 7 struct node{int x,s;};
 8 //Definition;//
 9 int n,m,sx,tx;
10 vector<int> rgr[N],gr[N];
11 //INput;//
12 bool in[N],avail[N];
13 //Usage;//
14 void rbfs(int pnt){
15     bool vis[N];
16     queue<int> q;
17     q.push(pnt);
18     memset(vis,0,sizeof vis);
19     in[pnt]=true;
20     while(!q.empty()){
21         int x=q.front();q.pop();
22         for(int i=0;i<rgr[x].size();i++)
23             if(!in[rgr[x][i]]){
24                 q.push(rgr[x][i]);
25                 in[rgr[x][i]]=true;
26             }
27     }
28 }
29 int bfs(int pnt,int tg){
30     bool vis[N];
31     queue<node> q;
32     memset(vis,0,sizeof vis);
33     q.push((node){pnt,0});
34     vis[pnt]=true;
35     while(!q.empty()){
36         int x=q.front().x,s=q.front().s;q.pop();
37         for(int i=0;i<gr[x].size();i++)
38             if(avail[gr[x][i]]&&!vis[gr[x][i]]){
39                 vis[gr[x][i]]=true;
40                 q.push((node){gr[x][i],s+1});
41                 if(gr[x][i]==tg)return s+1;
42             }
43         
44     }
45     return -1;
46 }
47 int main(){
48     cin>>n>>m;
49     for(int i=1;i<=m;i++){
50         int x,y;scanf("%d%d",&x,&y);
51         gr[x].push_back(y);
52         rgr[y].push_back(x);
53     }
54     cin>>sx>>tx;
55     rbfs(tx);
56     for(int i=1;i<=n;i++)
57         if(in[i]){
58             bool con=false;
59             for(int j=0;j<gr[i].size()&&!con;j++)
60                 if(!in[gr[i][j]])
61                     con=true;
62             if(!con)avail[i]=true;
63         }
64     avail[tx]=true;
65     cout<<bfs(sx,tx)<<endl;
66     return 0;
67 }
Method_01

  Vijos 113ms 洛谷Aqours 408ms AJAX 244ms

posted @ 2017-07-30 22:31  Darkins  阅读(185)  评论(0)    收藏  举报