92分求助,#11出错,实在想不出哪里还有问题
查看原帖
92分求助,#11出错,实在想不出哪里还有问题
597716
IT__windy楼主2022/4/6 11:23

最后几行都是对特殊情况的处理,实在想不出别的特例了

#include<bits/stdc++.h>
#define N 1000005
#define INF 1e9
using namespace std;
int stac[N],low[N],dfn[N],head[N],to[N],nex[N],num[N],belong[N],m[N],sm[N],in[N];
int top,tim,tot,cnt,n,p,r,ans;
bool vis[N],flag[N],f[N],fl;
vector<int>g[N];
int read(){
	int x=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*w;
}
void add(int x,int y){
	to[++tot]=y;
	nex[tot]=head[x];
	head[x]=tot;
}
void tarjan(int x){
	low[x]=dfn[x]=++tim;
	vis[x]=true;
	stac[++top]=x;
	int v;
	for(int i=head[x];i;i=nex[i]){
		v=to[i];
		if(!dfn[v]){
			tarjan(v);
			low[x]=min(low[x],low[v]);
		}
		else if(vis[v])
			low[x]=min(low[x],dfn[v]);
	}
	if(dfn[x]==low[x]){
		cnt++;
		sm[cnt]=INF;
		do{
			v=stac[top--];
			num[cnt]++;
			belong[v]=cnt;
			vis[v]=false;
			sm[cnt]=min(sm[cnt],m[v]);	
			g[cnt].push_back(v);	
		}while(x!=v);
	}
}
int main(){
	int x,y;
	n=read(),p=read();	
	for(int i=1;i<=n;i++)
		m[i]=INF;
	for(int i=1;i<=p;i++){
		x=read(),y=read();
		m[x]=y;
	}
	r=read();
	for(int i=1;i<=r;i++){
		x=read(),y=read();
		add(x,y);
		in[y]++;
	}	
	for(int i=1;i<=n;i++)
		if(!in[i]&&m[i]==INF){
			printf("NO\n%d",i);
			return 0;
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			tarjan(i);
	for(int i=1;i<=n;i++)
		if(!in[i]&&!flag[belong[i]]){
			ans+=sm[belong[i]];
			flag[belong[i]]=true;
			fl=true;
		}
	if(!fl){
		for(int i=1;i<=n;i++){
			for(int j=head[i];j;j=nex[j]){
				if(belong[i]!=belong[to[j]])
					f[belong[to[j]]]=true;
			}
		}
		for(int i=1;i<=cnt;i++)
			if(!f[i])ans+=sm[i];
	}
	printf("YES\n%d\n",ans);
	return 0;
}
2022/4/6 11:23
加载中...