Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- using namespace std;
- const int N = 1e5+7;
- int m, n, q, a, b, f, g, k;
- vector <int> G[N];
- int dist1[N];
- int dist2[N];
- int odwiedzony1[N];
- int odwiedzony2[N];
- int odwiedzony[N];
- int BFS(int v, int u)
- {
- for(int i = 1; i <= n; i++)
- {
- dist1[i]=N;
- dist2[i]=N;
- odwiedzony1[i]=0;
- odwiedzony2[i]=0;
- }
- dist1[v]=0;
- dist2[u]=0;
- queue<int> xd;
- queue<int> lol;
- odwiedzony1[v]=true;
- odwiedzony2[u]=true;
- xd.push(v);
- lol.push(u);
- while(!xd.empty() || !lol.empty())
- {
- if(!xd.empty())
- {
- f = xd.front();
- xd.pop();
- odwiedzony1[f] = true;
- if(odwiedzony2[f ]== 1)
- {
- return dist1[f] + dist2[f];
- }
- for(int i=0;i<G[f].size();i++)
- {
- if(dist1[f]+1<dist1[G[f][i]])
- {
- dist1[G[f][i]]=dist1[f]+1;
- xd.push(G[f][i]);
- }
- }
- }
- if(!lol.empty())
- {
- g = lol.front();
- lol.pop();
- odwiedzony2[g] = true;
- if(odwiedzony1[g]== 1)
- {
- return dist1[g] + dist2[g];
- }
- for(int i=0;i<G[g].size();i++)
- {
- if(dist2[g]+1<dist2[G[g][i]])
- {
- dist2[G[g][i]]=dist2[g]+1;
- xd.push(G[g][i]);
- }
- }
- }
- }
- return 2137;
- }
- void DFS (int v)
- {
- odwiedzony[v]=k;
- for(int i=0;i<G[v].size();i++)
- {
- if(!odwiedzony[G[v][i]])
- {
- DFS(G[v][i]);
- }
- }
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0);
- cin >> m >> n >> q;
- for(int i = 0; i < n; i++)
- {
- cin >> a >> b;
- G[a].push_back(b);
- G[b].push_back(a);
- }
- k++;
- for(int i=1; i<=n; i++)
- {
- if(odwiedzony[i]==0)
- {
- DFS(i);
- k++;
- }
- }
- for(int i = 0; i < q; i++)
- {
- cin >> a >> b;
- if(odwiedzony[a] != odwiedzony[b]) cout<<"-1\n";
- else cout << BFS(a,b) << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement