Visiting Cities

Back to Advanced Graph Problems

Implementation

C++

                                #include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define FASTIO ios_base::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL);
#define endl '\n'
#define INFL 9223372036854775807
#define ll long long

const int N = 100005;
vector<pii> adj[N];
vector<int> adj2[N];
long long processed[N],d[N];
int tot[N];
void dijkstra() {
    int s = 1;
    d[s] = 0; tot[s] = 1;
    set<pair<ll, ll>> q;
    q.insert({0, s});
    while (!q.empty()) {
        int v = q.begin()->second;
        q.erase(q.begin());

        for (auto edge : adj[v]) {
            int to = edge.first;
            ll len = edge.second;

            if (d[v] + len < d[to]) {
                q.erase({d[to], to});
                d[to] = d[v] + len;
                q.insert({d[to], to});
            } 
        }
    }
}

bool visited[N];
int tin[N], low[N];
int timer;
vector<int> cuts;
void dfs(int v, int p = -1) {
    visited[v] = true;
    tin[v] = low[v] = timer++;
    int children=0;
    for (int to : adj2[v]) {
        if (to == p) continue;
        if (visited[to]) {
            low[v] = min(low[v], tin[to]);
        } else {
            dfs(to, v);
            low[v] = min(low[v], low[to]);
            if (low[to] >= tin[v] && p!=-1)
                cuts.push_back(v);
            ++children;
        }
    }
    if(p == -1 && children > 1)
        cuts.push_back(v);
}
int n;
bool dfs2(int u) {
    if(processed[u]) return adj2[u].size() > 0;
    processed[u] = 1;
    bool isInPath = false;
    for(auto [v,w]:adj[u]) {
        if(d[u]+w != d[v]) continue;
        bool ret = dfs2(v);
        if(!ret) continue;
        adj2[u].push_back(v);
        adj2[v].push_back(u);
        isInPath = true;
    }
    return u == n || isInPath;
}

void solve() {
    int m;
    cin >> n >> m;
    for(int i=0;i<=n;i++) d[i] = INFL;
    for(int i=0;i<m;i++) {
        int u,v,w; 
        cin >> u >> v >> w;
        adj[u].push_back({v,w}); 
    }
    
    dijkstra();  
    for(int i=0;i<=n;i++) processed[i] = 0;
    dfs2(1); 
    dfs(1); cuts.push_back(1); cuts.push_back(n);
    cout<<cuts.size()<<endl;
    stable_sort(cuts.begin(),cuts.end());
    for(auto c:cuts) cout<<c<<" ";
}

int main() {
    FASTIO;
    int tc = 1;
    // cin>>tc;

    for(int i=1;i<=tc;i++) {
        solve();
    }
}