本篇文章对一些搜索题目进行摘录。
赵子龙七进七出
原题链接
题目描述
分析
每隔三条边才能算作跳一步过去,一开始的想法是重新建图,利用最短路求解。但是重新建图并不方便,由于问最少前进步数,所以可以直接$bfs$.设置数组$mark[s][step]$,表示到点$s$时是隔了几步,对$s$的邻接点进行遍历,$step$变成$(step+1)\pmod 3$.最后判断是否走到了终点,如果走到,步数除以$3$即可。
代码
展开查看 >folded1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <stack> #include <vector> #include <unordered_map>
#define INF 0x3f3f3f3f using namespace std; typedef long long ll; typedef pair<int,int> PI; const int maxn = 1e5+10; const ll mod = 1e9+7;
inline int read() { int x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar(); } return x * f; } int n,m; int s,t; vector<int>g[maxn]; int mark[maxn][3]; int dp[maxn][3];
void bfs() { queue<PI> q; q.push(PI(s,0)); mark[s][0] = 1; dp[s][0] = 0; while(!q.empty()) { PI now = q.front(); q.pop(); int u = now.first,step = now.second; for(auto v:g[u]) { int ss = (step+1)%3; if(mark[v][ss]==0) { mark[v][ss] = 1; dp[v][ss] = dp[u][step]+1; q.push(PI(v,ss)); } } } }
int main() { cin>>n>>m; while(m--) { int u,v; u = read(),v = read(); g[u].push_back(v); } cin>>s>>t; bfs(); if(mark[t][0]==0) { cout<<-1<<endl; return 0; } cout<<dp[t][0]/3; return 0; }
|