Submission #1290081

#TimeUsernameProblemLanguageResultExecution timeMemory
1290081win1702Sightseeing (NOI14_sightseeing)C++20
0 / 25
1 ms572 KiB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
struct Edge { int u,v,w; };
struct DSU {
    int n;
    vector<int> p, sz;
    DSU(int n=0){ init(n); }
    void init(int n_){
        n=n_;
        p.resize(n+1);
        sz.resize(n+1);
        for(int i=1;i<=n;i++){ p[i]=i; sz[i]=1; }
    }
    int find(int x){
        while (p[x]!=x){ p[x]=p[p[x]]; x=p[x]; }
        return x;
    }
    bool unite(int a,int b){
        a=find(a); b=find(b);
        if (a==b) return false;
        if (sz[a]<sz[b]) swap(a,b);
        p[b]=a; sz[a]+=sz[b];
        return true;
    }
};
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
	freopen("tinhcldd.inp","r",stdin);
	freopen("tinhcldd.out","w",stdout);
    int n; long long m; int q;
    if (!(cin>>n>>m>>q)) return 0;
    vector<Edge> E;
    E.reserve((size_t)min<long long>(m, 5000000LL));
    int u,v,w;
    int maxW = -1;
    for(long long i=0;i<m;i++){
        cin>>u>>v>>w;
        E.push_back({u,v,w});
        if (w>maxW) maxW=w;
    }
    // sort edges by descending weight (maximum spanning)
    sort(E.begin(), E.end(), [](const Edge &a, const Edge &b){
        return a.w > b.w;
    });

    DSU dsu(n);
    dsu.init(n);
    // build maximum spanning forest (only n-1 edges needed)
    vector<vector<pair<int,int>>> adj(n+1);
    adj.assign(n+1, {});
    adj.reserve(n+1);
    int added = 0;
    for(size_t i=0;i<E.size() && added < n-1; ++i){
        if (dsu.unite(E[i].u, E[i].v)){
            adj[E[i].u].push_back({E[i].v, E[i].w});
            adj[E[i].v].push_back({E[i].u, E[i].w});
            ++added;
        }
    }

    // BFS/DFS from node 1 to compute min-edge-on-path to 1
    const int NEG = -1;
    vector<int> ans(n+1, NEG);
    if (n >= 1){
        // If there are no edges, let's define ans[1] = maxW (if exists) else -1
        if (maxW == -1) ans[1] = -1;
        else ans[1] = maxW;

        // iterative stack DFS
        vector<int> st;
        vector<int> parent(n+1, 0);
        st.reserve(n);
        st.push_back(1);
        parent[1]=1;
        // For node 1, ans[1] already set to maxW; for its neighbors compute min
        while(!st.empty()){
            int x = st.back(); st.pop_back();
            for (auto &pr : adj[x]){
                int y = pr.first;
                int wt = pr.second;
                if (parent[y]==0){ // unvisited
                    parent[y]=x;
                    if (x==1) ans[y] = wt;
                    else ans[y] = min(ans[x], wt);
                    st.push_back(y);
                }
            }
        }
    }

    // answer queries
    for(int i=0;i<q;i++){
        int p; cin>>p;
        cout << ans[p] << '\n';
    }
    return 0;
}

Compilation message (stderr)

sightseeing.cpp: In function 'int main()':
sightseeing.cpp:30:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |         freopen("tinhcldd.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
sightseeing.cpp:31:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   31 |         freopen("tinhcldd.out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...