急救,玄大关
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/12/12 22:06
  • 上次更新2023/12/13 12:08:42
查看原帖
急救,玄大关
750292
封禁用户楼主2023/12/12 22:06

P3275用的tarjan+topo结果全WA,当然我知道我写的什么也不是,但是还是求调

代码

#include<bits/stdc++.h>
using namespace std;
const int N=100001;
int n,m,head[N],ecnt,dfn[N],low[N],dcnt,val[N],stk[N],stop,col[N],cval[N],ctot,que[N],frnt,rear,f[N],outd[N];
bool instk[N];
vector<int >ve[N];
struct edge{
	int nxt,to;
	edge(){};
	edge(int u,int v){
		nxt=u;
		to=v;
	}
}e[N<<1];
template<typename T>inline void read(T &x){
	x=0;
	char c=getchar();
	if(!isdigit(c)){
		c=getchar();
	}
	if(isdigit(c)){
		x=x*10+(c^48);
		c=getchar();
	}
}
inline void minn(int a,int b){
	if(b<a) a=b;
}
inline void maxx(int a,int b){
	if(b>a) a=b;
}
inline void adde(int u,int v){
	if(u==v){
		return ;
	}
	e[++ecnt]=edge(head[u],v);
	head[u]=ecnt;
}
inline void tarjan(int cur){
	dfn[cur]=low[cur]=++dcnt;
	stk[++stop]=cur;
	instk[cur]=true;
	for(int i=head[cur];i;i=e[i].nxt ){
		int till=e[i].to ;
		if(!dfn[till]){
			tarjan(till);
			minn(low[cur],low[till]);
		}
		else if(instk[till]) minn(low[cur],dfn[till]);
	}
	if(low[cur]==dfn[cur]){
		int tmp;
		++ctot;
		do{
			tmp=stk[stop--];
			col[tmp]=ctot;
			cval[ctot]+=val[tmp];
			instk[tmp]=false;
		}while(tmp!=cur);
	}
}
inline void aded(int u,int v){
	ve[v].push_back(u) ;
	++outd[u];
}
inline void topo(){
	for(int i=1;i<=ctot;i++){
		if(!outd[i]){
			que[++rear]=i;
		}
	}
	int ans=0;
	while(frnt<rear){
		int cur=que[++frnt];
		f[cur]+=cval[cur];
		maxx(ans,f[cur]);
		for(unsigned i=0;i<ve[cur].size() ;i++){
			int fr=ve[cur][i];
			maxx(f[fr],f[cur]);
			--outd[fr];
			if(!outd[fr]){
				que[++rear]=fr;
			}
		}
	}
	cout<<ans<<endl;
}
int main(){
	read(n);
	read(m);
	for(int i=1;i<=m;i++){
		int x,a,b;
		read(x);
		read(a);
		read(b);
		switch(x){
			case 1:{
				adde(a,0);
				adde(b,0);
				break;
			}
			case 2:{
				adde(b,1);
				break;
			}
			case 3:{
				adde(a,0);
				break;
			}
			case 4:{
				adde(a,1);
				break;
			}
			case 5:{
				adde(b,0);
				break;
			}
		}
	} 
	for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=e[j].nxt ){
			int till=e[j].to ;
			if(col[i]!=col[till]){
				aded(col[i],col[till]);
			}
		}
	}
	topo();
	return 0;
}
2023/12/12 22:06
加载中...