寻找道路——稍坑的搜索水题
先从反向图搜一遍,谁都能想出来。我第一次反向搜用的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 }
后来新加了个数组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;
所以最终版本如下:
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 }
Vijos 113ms 洛谷Aqours 408ms AJAX 244ms

浙公网安备 33010602011771号