Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <stdio.h>
- #include <queue>
- #include <set>
- #include <string>
- using namespace std;
- const int INF = 1000000000;
- int mn;
- int n, m;
- vector<set<int>> g;
- vector<pair<int, int>> edges;
- void bfs(int s, vector<int> &d){
- d[s] = 0;
- vector<bool> used(n);
- used[s] = true;
- queue<int> q;
- q.push(s);
- while(!q.empty()){
- int u = q.front();
- q.pop();
- for(auto i = g[u].begin(); i != g[u].end(); i++){
- if(!used[*i]){
- q.push(*i);
- used[*i] = true;
- d[*i] = d[u] + 1;
- }
- }
- }
- }
- vector<vector<pair<int, int>>> ng;
- vector<bool> used;
- vector<int> tin, fup;
- int timer;
- vector<pair<pair<int, int>,int>> ans;
- void dfs(int v, int p = -1) {
- used[v] = true;
- tin[v] = fup[v] = timer++;
- for (size_t i=0; i<ng[v].size(); ++i) {
- int to = ng[v][i].first;
- if (to == p) continue;
- if (used[to]){
- fup[v] = min (fup[v], tin[to]);
- if (fup[to] > tin[v])
- ans.push_back(make_pair(make_pair(min(v, to), max(v, to)), ng[v][i].second));
- }
- else {
- dfs (to, v);
- fup[v] = min (fup[v], fup[to]);
- if (fup[to] > tin[v])
- ans.push_back(make_pair(make_pair(min(v, to), max(v, to)), ng[v][i].second)); //what have i written here?!
- }
- }
- }
- void find_bridges() {
- timer = 0;
- for (int i=0; i<n; ++i)
- used[i] = false;
- for (int i=0; i<n; ++i)
- if (!used[i])
- dfs (i);
- }
- int main()
- {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- scanf("%d%d", &n, &m);
- g = vector<set<int>> (n);
- edges = vector<pair<int, int>> (m);
- for(int i = 0; i < m; i++){
- int cur1, cur2;
- scanf("%d%d", &cur1, &cur2);
- cur1--; cur2--;
- g[cur1].insert(cur2);
- g[cur2].insert(cur1);
- edges[i] = make_pair(cur1, cur2);
- }
- vector<int> d1(n, INF), d2(n, INF);
- bfs(0, d1);
- bfs(n-1, d2);
- mn = d1[n-1];
- //vector<pair<int, int>> br; //draft "bridges"
- //d1[u] + 1 + d2[v] == mincost d1[v] + 1 + d2[u] == mincost
- ng = vector<vector<pair<int, int>>> (n);
- tin = fup = vector<int> (n);
- used = vector<bool> (n);
- for(int i = 0; i < m; i++){
- int u = edges[i].first;
- int v = edges[i].second;
- if(u != v && (d1[u] + 1 + d2[v] == mn || d1[v] + 1 + d2[u] == mn)){
- //br.push_back(edges[i]);
- ng[u].push_back(make_pair(v, i));
- ng[v].push_back(make_pair(u, i));
- }
- }
- dfs(0);
- sort(ans.begin(), ans.end());
- set<int> s;
- //if(ans.size() < 2 || ans.size() > 1 && ans[0].first.first != ans[1].first.first && ans[0].first.second != ans[1].first.second)
- // s.insert(ans[0].second);
- for(int i = 0; i < ans.size(); i++){
- bool flag = false;
- while(i < ans.size()-1 && (ans[i].first.first == ans[i+1].first.first && ans[i].first.second == ans[i+1].first.second)){
- flag = true;
- ++i;
- }
- if(flag)
- ++i;
- if(i < ans.size()){
- s.insert(ans[i].second);
- }
- //cout << ans[i].first.first + 1 << " " << ans[i].first.second + 1 << " " << ans[i].second + 1 << endl;
- }
- cout << s.size() << endl;
- for(auto it = s.begin(); it != s.end(); it++)
- cout << *it + 1 << " ";
- //cout << ans.size() << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement