求助,70分 MLE
查看原帖
求助,70分 MLE
1419569
Z_kazuha楼主2024/10/14 10:15
#include <bits/stdc++.h>
using namespace std;
const int N=2e4+5;
const int M=2e5+5;
const int mod=1e9;
int n,m;
vector<int> e[N],e1[N];
int vis[N],head[M],cnt,ru[N],ru1[N],dis[N];
bool op[N],flag,vis1[N];
struct node{int to,nxt;}ed[M];
void add(int u,int v){ed[++cnt].to=v;ed[cnt].nxt=head[u];head[u]=cnt;}
void dfs(int x){
	vis[x]=1;
	for(int i=0;i<e[x].size();i++){
		int v=e[x][i];
		if(!op[v])dfs(v);
		op[v]=1;
	}
}
void dfs1(int x){
	vis[x]+=2;
	for(int i=0;i<e1[x].size();i++){
		int v=e1[x][i];
		if(!op[v])dfs1(v);
		op[v]=1;
	}
}
void dfs2(int x){
	op[x]=1;
	for(int i=0;i<e[x].size();i++){
		int v=e[x][i];
		if(vis[v]==3){
			add(x,v);
			//cout<<x<<" "<<v<<endl;
			ru1[v]++;
			if(ru1[v]>ru[v]){
				flag=1;
				cout<<"inf";
			}
			if(!op[v])dfs2(v);
			op[v]=1;	
		}
	}
}
void dij(){
	dis[1]=1;queue<int> q;
	q.push(1);
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=head[x];i;i=ed[i].nxt){
				int v=ed[i].to;
				dis[v]=(dis[v]+dis[x])%mod;
				//cout<<x<<" "<<v<<" "<<dis[v]<<endl;
				ru1[v]--;
				if(!ru1[v])q.push(v);}
	
	}
	
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		ru[v]++;
		e[u].push_back(v);
		e1[v].push_back(u);
	}
	dfs(1);
	for(int i=1;i<=n;i++)op[i]=0;
	dfs1(2);
	if(vis[1]!=3){cout<<0;return 0;}
	for(int i=1;i<=n;i++)op[i]=0;
	dfs2(1);
	if(flag==1)return 0;
	dij();
	//for(int i=1;i<=n;i++)cout<<ru1[i]<<" ";
	cout<<dis[2];
	return 0;
}
2024/10/14 10:15
加载中...