社区讨论
40pts WA
P10935银河参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mjwrqwg3
- 此快照首次捕获于
- 2026/01/02 19:06 2 个月前
- 此快照最后确认于
- 2026/01/05 17:30 上个月
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct edge{int v,w;};
const int N=1e5+5;
vector<edge>g[N],gi[N];
int dis[N],scc,clk,id[N],dfn[N],low[N],stk[N],tp;
int f[N],sz[N];
int in_stk[N];
void tarjan(int u){
dfn[u]=low[u]=++clk;
in_stk[u]=1;stk[++tp]=u;
for(auto t : g[u]){
int v=t.v;
if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}
else if(in_stk[v]){low[u]=min(low[u],low[v]);}
}
if(dfn[u]==low[u]){
int v;
++scc;
do{
v=stk[tp--];
in_stk[v]=0;
id[v]=scc;
++sz[scc];
}while(u!=v);
}
}
signed main(){
cin.tie(nullptr)->sync_with_stdio(0);
int n,m,T,A,B;cin>>n>>m;
while(m--){
cin>>T>>A>>B;
switch(T){
case 1: g[A].push_back({B,0}),g[B].push_back({A,0});break;
case 2: g[A].push_back({B,1});break;
case 3: g[B].push_back({A,0});break;
case 4: g[B].push_back({A,1});break;
default: g[A].push_back({B,0});
}
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
int sum=0;
for(int i=1;i<=n;i++)
for(auto j:g[i]){
int u=id[i],v=id[j.v];
if(u==v and j.v){
puts("-1");
return 0;
}
if(u!=v)gi[u].push_back({v,j.w});
}
for(int i=scc;i;--i){
if(!f[i])f[i]=1;
for(auto j:gi[i])f[j.v]=max(f[j.v],f[i]+j.w);
sum+=f[i]*sz[i];
}
cout<<sum<<endl;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...