社区讨论

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 条回复,欢迎继续交流。

正在加载回复...