Advertisement
kokokozhina

266

Jun 3rd, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stdio.h>
  4. #include <queue>
  5. #include <set>
  6. #include <string>
  7.  
  8. using namespace std;
  9.  
  10. const int INF = 1000000000;
  11. int mn;
  12. int n, m;
  13. vector<set<int>> g;
  14. vector<pair<int, int>> edges;
  15.  
  16. void bfs(int s, vector<int> &d){
  17.     d[s] = 0;
  18.     vector<bool> used(n);
  19.     used[s] = true;
  20.     queue<int> q;
  21.     q.push(s);
  22.     while(!q.empty()){
  23.         int u = q.front();
  24.         q.pop();
  25.         for(auto i = g[u].begin(); i != g[u].end(); i++){
  26.             if(!used[*i]){
  27.                 q.push(*i);
  28.                 used[*i] = true;
  29.                 d[*i] = d[u] + 1;
  30.             }
  31.         }  
  32.     }
  33. }  
  34.  
  35. vector<vector<pair<int, int>>> ng;
  36. vector<bool> used;
  37. vector<int> tin, fup;
  38. int timer;
  39. vector<pair<pair<int, int>,int>> ans;
  40.  
  41. void dfs(int v, int p = -1) {
  42.     used[v] = true;
  43.     tin[v] = fup[v] = timer++;
  44.     for (size_t i=0; i<ng[v].size(); ++i) {
  45.         int to = ng[v][i].first;
  46.         if (to == p)  continue;
  47.         if (used[to]){
  48.             fup[v] = min (fup[v], tin[to]);
  49.             if (fup[to] > tin[v])
  50.                 ans.push_back(make_pair(make_pair(min(v, to), max(v, to)), ng[v][i].second));
  51.         }
  52.         else {
  53.             dfs (to, v);
  54.             fup[v] = min (fup[v], fup[to]);
  55.             if (fup[to] > tin[v])
  56.                 ans.push_back(make_pair(make_pair(min(v, to), max(v, to)), ng[v][i].second)); //what have i written here?!
  57.         }
  58.     }
  59. }
  60.  
  61. void find_bridges() {
  62.     timer = 0;
  63.     for (int i=0; i<n; ++i)
  64.         used[i] = false;
  65.     for (int i=0; i<n; ++i)
  66.         if (!used[i])
  67.             dfs (i);
  68. }
  69.  
  70. int main()
  71. {
  72. #ifdef _DEBUG
  73.     freopen("input.txt", "r", stdin);
  74.     freopen("output.txt", "w", stdout);
  75. #endif
  76.     scanf("%d%d", &n, &m);
  77.     g = vector<set<int>> (n);
  78.     edges = vector<pair<int, int>> (m);
  79.     for(int i = 0; i < m; i++){
  80.         int cur1, cur2;
  81.         scanf("%d%d", &cur1, &cur2);
  82.         cur1--; cur2--;
  83.         g[cur1].insert(cur2);
  84.         g[cur2].insert(cur1);
  85.         edges[i] = make_pair(cur1, cur2);
  86.     }
  87.     vector<int> d1(n, INF), d2(n, INF);
  88.     bfs(0, d1);
  89.     bfs(n-1, d2);
  90.     mn = d1[n-1];
  91.     //vector<pair<int, int>> br; //draft "bridges"
  92.     //d1[u] + 1 + d2[v] == mincost  d1[v] + 1 + d2[u] == mincost
  93.     ng = vector<vector<pair<int, int>>> (n);
  94.     tin = fup = vector<int> (n);
  95.     used = vector<bool> (n);
  96.     for(int i = 0; i < m; i++){
  97.         int u = edges[i].first;
  98.         int v = edges[i].second;
  99.         if(u != v && (d1[u] + 1 + d2[v] == mn || d1[v] + 1 + d2[u] == mn)){
  100.             //br.push_back(edges[i]);
  101.             ng[u].push_back(make_pair(v, i));
  102.             ng[v].push_back(make_pair(u, i));
  103.         }
  104.     }
  105.     dfs(0);
  106.     sort(ans.begin(), ans.end());
  107.     set<int> s;
  108.     //if(ans.size() < 2 || ans.size() > 1 && ans[0].first.first != ans[1].first.first && ans[0].first.second != ans[1].first.second)
  109.     //  s.insert(ans[0].second);
  110.     for(int i = 0; i < ans.size(); i++){
  111.         bool flag = false;
  112.         while(i < ans.size()-1 && (ans[i].first.first == ans[i+1].first.first && ans[i].first.second == ans[i+1].first.second)){
  113.             flag = true;
  114.             ++i;
  115.         }
  116.         if(flag)
  117.             ++i;
  118.         if(i < ans.size()){
  119.             s.insert(ans[i].second);
  120.         }
  121.         //cout << ans[i].first.first + 1 << " " << ans[i].first.second + 1 << " " << ans[i].second + 1 << endl;
  122.     }
  123.     cout << s.size() << endl;
  124.     for(auto it = s.begin(); it != s.end(); it++)
  125.         cout << *it + 1 << " ";
  126.     //cout << ans.size() << endl;
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement