这是我自己的程序:
#include<bits/stdc++.h>
using namespace std;
vector<long long>G[2000010];
stack<long long>s;
long long dfn[2000010],low[2000010],cnt;
long long used[2000010],vis[2000010];
long long color[1000001],num[2000010],colornum;
long long n,m,p;
long long Ans[2000010],anS[2000010],ans=1e8,ANS;
void paint(long long x){s.pop(),color[x]=colornum,num[colornum]++,vis[x]=0;}
void tarjan(long long x)
{
Ans[x]=anS[x]=1e8;
dfn[x]=low[x]=++cnt,s.push(x),vis[x]=used[x]=1;
for(int i=0;i<G[x].size();i++)
{
int q=G[x][i];
if(!dfn[q]) tarjan(q),low[x]=min(low[x],low[q]);
else if (vis[q]) low[x]=min(low[x],dfn[q]);
}
if (low[x]==dfn[x]){
colornum++;
while(s.top()!=x){
int t=s.top();
paint(t);
}
paint(x);
}
}
long long Us[2000010];
bool bJ[2000010];
bool BJ;
int main()
{
cin>>n;
cin>>p;
for(int i=1;i<=p;i++)
{
int x,y;
cin>>x>>y;
bJ[x]=1,Us[x]=y;
}
cin>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
G[x].push_back(y);
}
for(int i=1;i<=n;i++)
if (!used[i]) tarjan(i);
for(long long i=1;i<=n;i++)
{
anS[color[i]]=min(anS[color[i]],i);
if(bJ[i] || !Ans[color[i]]){
Ans[color[i]]=min(Ans[color[i]],Us[i]);
for(int j=0;j<G[i].size();j++){
int v=G[i][j];
if(color[v]!=color[i]) Ans[color[v]]=0;
}
}
}
for(int i=1;i<=colornum;i++)
{
if(Ans[i]==1e8) BJ=1,ans=min(ans,anS[i]);
else ANS+=Ans[i];
}
if(!BJ) cout<<"YES"<<endl<<ANS;
else cout<<"NO"<<endl<<ans;
return 0;
}
并且老师说这题数据不严谨,所以说......
hack 拿来!