越改越低了,第一个样例输出100
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct Node{
int from,to,next;
}a[N],b[N];
int dfn[N],belong[N],ins[N],low[N],cnt,tot,tt,s[N],n,p,r,timestamp,tot2,w[N],ans,head[N],head2[N],ru[N];
vector<int> res[N];
void add(int u,int v){
a[++tot].from=u;
a[tot].next=head[u];
a[tot].to=v;
head[u]=tot;
}
void add2(int u,int v){
ru[v]++;
b[++tot2].from=u;
b[tot2].next=head2[u];
b[tot2].to=v;
head2[u]=tot2;
}
void dfs(int u){
dfn[u]=low[u]=++timestamp;
s[++tt]=u;
ins[u]=1;
for(int i=head[u];i;i=a[i].next){
int v=a[i].to;
if(!dfn[v]){
dfs(v);
low[u]=min(low[u],low[v]);
}else if(ins[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
int y=0;
++cnt;
while(y=s[tt--]){
belong[y]=cnt;
ins[y]=0;
if(y==u)break;
w[u]=min(w[u],w[y]);
}
}
}
int main(){
memset(w,0x3f,sizeof(w));
cin>>n>>p;
for(int i=1;i<=p;i++){
int idx,ww;
cin>>idx>>ww;
w[idx]=ww;
}
cin>>r;
for(int i=1;i<=r;i++){
int u,v;
cin>>u>>v;
add(u,v);
}
for(int i=1;i<=n;i++){
if(!dfn[i]&&w[i]!=0x3f3f3f3f){
dfs(i);
}
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
cout<<"NO"<<endl;
cout<<i<<endl;
return 0;
}
}
for(int i=1;i<=r;i++){
int x=belong[a[i].from],y=belong[a[i].to];
if(x!=y){
add2(x,y);
}
}
for(int i=1;i<=cnt;i++){
if(w[i]!=0x3f3f3f3f&&ru[i]==0){
ans+=w[i];
}
}
cout<<"YES"<<endl;
cout<<ans<<endl;
return 0;
}