**有没有大佬帮我这个蒟蒻看看P1262 间谍网络这道题,数据是我们学校oj的数据,卡了半天了就是memset有问题。 **
#include <bits/stdc++.h>
using namespace std;
int n,p,r;
int tot,cnt;
vector <int> G[10005];
int dfn[10005],low[10005],scc[10005],in[10005],sum[10005];
int spy[10005];
bool instack[10005];
stack <int> stk;
void Tarjan(int u){
dfn[u]=++tot;
low[u]=dfn[u];
stk.push(u);
instack[u]=true;
int size=G[u].size();
for(int i=0;i<size;i++){
int v=G[u][i];
if(dfn[v]==0){
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v]==true){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
scc[u]=++cnt;
while(stk.top()!=u){
int x=stk.top();
scc[x]=cnt;
instack[x]=false;
stk.pop();
}
instack[u]=false;
stk.pop();
}
}
int main(){
scanf("%d %d",&n,&p);
//90分
// memset(spy,0x7f7f7f,sizeof(spy));
// memset(sum,0x7f7f7f,sizeof(sum));
//72分
// memset(spy,0x7f7f7f,n);
// memset(sum,0x7f7f7f,sizeof(sum));
for(int i=1;i<=p;i++){
int name,money;
scanf("%d %d",&name,&money);
spy[name]=money;
}
scanf("%d",&r);
for(int i=1;i<=r;i++){
int a,b;
scanf("%d %d",&a,&b);
G[a].push_back(b);
}
for(int i=1;i<=n;i++){
//90分
// if(dfn[i]==0&&spy[i]!=0x7f7f7f){
// Tarjan(i);
// }
//72分
// if(dfn[i]==0&&spy[i]!=0x7f7f7f){
// Tarjan(i);
// }
}
for(int i=1;i<=n;i++){
if(dfn[i]==0){
printf("NO\n");
printf("%d",i);
return 0;
}
}
int ans=0;
for(int i=1;i<=n;i++){
int size=G[i].size();
for(int j=0;j<size;j++){
int v=G[i][j];
if(scc[i]!=scc[v]){
in[scc[v]]++;
}
}
}
for(int i=1;i<=n;i++){
sum[scc[i]]=min(sum[scc[i]],spy[i]);
}
for(int i=1;i<=cnt;i++){
if(in[i]==0){
ans+=sum[i];
}
}
printf("YES\n");
printf("%d",ans);
return 0;
}