洛谷P1262
筱柒Littleseven
QQ:3534947775
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 3030;
const int maxm = 8080;
int n,p,r,ans;
int tot,head[maxn],nex[maxm],to[maxm];
int money[maxn],cnt,vis[maxn];
int tar_stack[maxn],tar_ins[maxn],top,tar_cnt,tar_min[maxn],tar_vis[maxn];
int tar_deep[maxn],tar_low[maxn],tar_bel[maxn],tar_in[maxn];
void add(int a,int b){ to[++tot]=b; nex[tot]=head[a]; head[a]=tot; }
void dfs(int x)
{
if(vis[x]) return; vis[x]=1; cnt++;
for(int i=head[x];i;i=nex[i]) dfs(to[i]);
}
void tarjan(int x)
{
tar_stack[++top]=x; tar_vis[x]=1; tar_ins[x]=1;
tar_low[x]=++tar_cnt; tar_deep[x]=tar_cnt;
for(int i=head[x];i;i=nex[i])
{
int j=to[i];
if(!tar_vis[j]) tarjan(j),tar_low[x]=min(tar_low[x],tar_low[j]);
else if(tar_ins[j]) tar_low[x]=min(tar_low[x],tar_deep[j]);
}
if(tar_deep[x]==tar_low[x])
{
tar_min[x]=2147483647; int tmp;
do{
tmp=tar_stack[top--]; tar_ins[tmp]=0;
tar_bel[tmp]=x; tar_min[x]=min(tar_min[x],money[tmp]);
}while(tmp!=x);
}
}
int main()
{
cin>>n>>p;
for(int i=1;i<=n;i++)money[i]=2147483647;
for(int i=1;i<=p;i++){ int a,b; cin>>a>>b; money[a]=b; }
cin>>r;
for(int i=1;i<=r;i++){ int a,b; cin>>a>>b; add(a,b); }
for(int i=1;i<=n;i++){ if(money[i]<2147483647) dfs(i); }
if(cnt<n)
for(int i=1;i<=n;i++){ if(vis[i]==0) { cout<<"NO"<<endl<<i<<endl; return 0; } }
for(int i=1;i<=n;i++) tar_vis[i]=0;
for(int i=1;i<=n;i++){ if(!tar_vis[i]) tarjan(i); }
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=nex[j])
if(tar_bel[i]!=tar_bel[to[j]]) tar_in[tar_bel[to[j]]]++;
for(int i=1;i<=n;i++)
if(tar_in[i]==0 && tar_bel[i]==i) ans+=tar_min[i];
cout<<"YES"<<endl<<ans<<endl;
return 0;
}