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;
}