MnZn WA50 求助QwQ
查看原帖
MnZn WA50 求助QwQ
401461
Augury楼主2023/2/1 14:38

已经调了一天了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+10;
int n,m;
struct edge{
	int to,cost;
};
struct ge{
	int x,a,b;
};
vector<ge>E;
vector<int>g[maxn];
int dfn[maxn],low[maxn],col[maxn];
int cnt=0,clr=0;
bool vis[maxn];
stack<int>st;
int sz[maxn];
int in[maxn];
vector<edge>g1[maxn];
int dp[maxn];
int sum=0;
int ans=0;
void tarjan(int now){
	dfn[now]=low[now]=++cnt;
	vis[now]=1;
	st.push(now);
	for(int i=0;i<(int)g[now].size();i++){
		int nxt=g[now][i];
		if(!dfn[nxt]){
			tarjan(nxt);
			low[now]=min(low[now],low[nxt]);
		}
		else if(vis[nxt])low[now]=min(low[now],dfn[nxt]);
	}
	if(dfn[now]==low[now]){
		int tmp=-1;
		clr++;
		while(tmp!=now){
			tmp=st.top();
			st.pop();
			col[tmp]=clr;
			vis[tmp]=0;
			sz[clr]++;
		}
	}
}
void add(int u,int v,int w){
	in[v]++;
	g1[u].push_back((edge){v,w});
}
void build(){
	for(int i=0;i<(int)E.size();i++){
		ge now=E[i];
		int ap=col[now.a];
		int bp=col[now.b];
		if(ap==bp){
			if(now.x==2||now.x==4){
				cout<<-1;
				exit(0);
			}
			continue;
		}
//		cout<<ap<<' '<<bp<<' '<<(now.x+1)%2<<endl;
		if(now.x==2)add(ap,bp,1);
		if(now.x==3)add(ap,bp,0);
		if(now.x==4)add(bp,ap,1);
		if(now.x==5)add(bp,ap,0);
	}
}
void topsort(){
	queue<int>q;
	for(int i=1;i<=clr;i++)if(in[i]==0)dp[i]=1,q.push(i);
//	for(int i=1;i<=clr;i++)cout<<in[i]<<' ';
//	cout<<endl;
	while(!q.empty()){
		int now=q.front();
		q.pop();
		sum++;
//		cout<<sum<<endl;
		for(int i=0;i<(int)g1[now].size();i++){
			edge nxt=g1[now][i];
			in[nxt.to]--;
			dp[nxt.to]=max(dp[nxt.to],dp[now]+nxt.cost);
			if(!in[nxt.to])q.push(nxt.to);
		}
	}
}
signed main(){
//    freopen("data.in","r",stdin);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++){
		int x,a,b;
		scanf("%lld%lld%lld",&x,&a,&b);
		if(x==1)g[a].push_back(b),g[b].push_back(a);
		if(x==3)g[a].push_back(b);
		if(x==5)g[b].push_back(a);
		E.push_back((ge){x,a,b});
	}
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	build();
//	return -1;
	topsort();
	if(sum<clr){
		cout<<-1;
		return 0;
	}
//	for(int i=1;i<=n;i++)cout<<col[i]<<' ';
//	cout<<endl;
//	for(int i=1;i<=clr;i++)cout<<dp[i]<<' ';
//	cout<<endl;
	for(int i=1;i<=clr;i++)ans+=dp[i]*sz[i];
	cout<<ans;
	return 0;
}
/*
萌新自己造的数据
3 2
2 1 2
5 2 3

3 3
1 1 2
2 2 3
4 1 3
*/
2023/2/1 14:38
加载中...