社区讨论
玄关求条,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 条回复,欢迎继续交流。
正在加载回复...