最后几行都是对特殊情况的处理,实在想不出别的特例了
#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;
}