Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define pf printf
- #define sf scanf
- #define SIZE 1000000 // 10^6
- using namespace std;
- vector<int> graph[SIZE+1];
- map<int , string> res;
- bool isValid = false;
- vector<int> adj;
- int bfs(int src , int dest)
- {
- isValid = true ;
- int cnt = 1 ;
- map<int , int> vis;
- map<int , int> parent;
- //map<int , int> label;
- queue<int> q;
- parent[src] = 0;
- vis[src] = 1;
- //label[src] = 0;
- q.push(src);
- while(!q.empty())
- {
- int u = q.front();
- int v;
- int uLen = graph[u].size();
- for (int i = 0 ; i <uLen ; i++)
- {
- v = graph[u][i];
- if(!vis[v])
- {
- vis[v] = 1;
- parent[v] = u;
- //label[v] = label[u] + 1;
- q.push(v);
- cnt++;
- if (v == dest )
- {
- adj.push_back(dest);
- int p = parent[dest];
- for (int i = 0 ; i < cnt ; i++)
- {
- adj.push_back(p);
- p = parent[p];
- if(p == src)
- {
- adj.push_back(src);
- return 1;
- }
- }
- }
- }
- }
- q.pop();
- }
- return 0;
- }
- int main ()
- {
- //freopen("in.txt" , "r" ,stdin);
- //freopen("out.txt" , "w" , stdout);
- int edges;
- string src , dest;
- while(sf("%d",&edges) == 1)
- {
- if(isValid) { pf("\n"); isValid = false; }
- map<string,int> mp;
- int cnt = 0;
- for (int i = 0 ; i < edges ; i++)
- {
- cin >> src >> dest;
- if (mp.find(src) == mp.end()) {
- mp[src] = ++cnt;
- res[cnt] = src;
- }
- if (mp.find(dest) == mp.end()){
- mp[dest] = ++cnt;
- res[cnt] = dest;
- }
- int u = mp[src];
- int v = mp[dest];
- graph[u].push_back(v);
- graph[v].push_back(u);
- }
- cin >> src >> dest;
- if (mp.find(src) == mp.end()) {
- mp[src] = ++cnt;
- res[cnt] = src;
- }
- if (mp.find(dest) == mp.end()) {
- mp[dest] = ++cnt;
- res[cnt] = dest;
- }
- int tmp = bfs(mp[src] , mp[dest]);
- if (src == dest)
- {
- cout << res[mp[src]] << " " << res[mp[dest]] << "\n";
- }
- else if(!tmp)
- {
- cout << "No route" << "\n";
- }
- else
- {
- reverse(adj.begin() , adj.end());
- for (int i = 0 ; i < adj.size()-1 ; i++)
- {
- int u = adj[i];
- int v = adj[i+1];
- cout << res[u] << " " << res[v] << "\n";
- }
- }
- memset(graph , 0 , sizeof(graph));
- res.clear();
- adj.clear();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement