社区讨论

玄关求条,Linux和Windows评测结果不同

P2416泡芙参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mm61x2u1
此快照首次捕获于
2026/02/28 16:20
上周
此快照最后确认于
2026/03/02 16:50
上周
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int ls(int x){return x * 2;}
int rs(int x){return x * 2 + 1;}
const int N = 3e5 + 5;
int n , m , q , dep[N] , dfn[N] , tot , low[N] , id , scc[N] , val[N] , f[N][20] , sum[N] , a[N] , b[N] , c[N];
set<pair<int , int> >st;
template<class T>inline T read(){
    T f = 1 , x = 0;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-')f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9'){
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return f * x;
}
struct edge{
    int v , w , id;
};
vector<edge>g[N] , r[N];
stack<int>stk;
void tarjan(int x , int fa){
    dfn[x] = low[x] = ++tot;
    stk.push(x);
    for(auto i : g[x]){
        if(i.w == fa)continue;
        if(!dfn[i.v]){
            tarjan(i.v , i.w);
            low[x] = min(low[x] , low[i.v]);
        }else low[x] = min(low[x] , dfn[i.v]);
    }
    if(dfn[x] == low[x]){
        id++;
        while(!stk.empty()){
            int t = stk.top();
            stk.pop();
            scc[t] = id;
            if(t == x)break;
        }
    }
}
void dfs(int x , int fa){
    dep[x] = dep[fa] + 1;
    sum[x] += val[x];
    f[x][0] = fa;
    for(int i = 1;i <= 19;i--)f[x][i] = f[f[x][i - 1]][i - 1];
    for(auto i : r[x]){
        if(i.v == fa)continue;
        sum[i.v] = sum[x] + i.w;
        dfs(i.v , x);
    }
}
int LCA(int x , int y){
    if(dep[x] < dep[y])swap(x , y);
    for(int i = 19;i >= 0;i--){
        if(dep[f[x][i]] >= dep[y])x = f[x][i];
    }
    if(x == y)return x;
    for(int i = 19;i >= 0;i--){
        if(f[x][i] == f[y][i])continue;
        x = f[x][i]; y = f[y][i];
    }
    return f[x][0];
}
signed main(){
    cout << stk.size() << ' ';
    cin >> n >> m;
    for(int i = 1;i <= m;i++){
        int u , v , w;
        cin >> u >> v >> w;
        g[u].push_back(edge{v , i});
        g[v].push_back(edge{u , i});
        a[i] = u , b[i] = v , c[i] = w;
    }
    for(int i = 1;i <= n;i++){
        if(!dfn[i])tarjan(i , 0);
    }
    for(int i = 1;i <= m;i++){
        int u = a[i] , v = b[i];
        if(scc[u] == scc[v])val[scc[u]] += c[i];
        else{
            r[scc[u]].push_back(edge{scc[v] , c[i]});
            r[scc[v]].push_back(edge{scc[u] , c[i]});
        }
    }
    dfs(1 , 0);
    cin >> q;
    while(q--){
        int s , t;
        cin >> s >> t;
        s = scc[s]; t = scc[t];
        int l = LCA(s , t);
        if(sum[s] + sum[t] - 2 * sum[l] + val[l])cout << "YES\n";
        else cout << "NO\n";
    }
    return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...