tarjan84pts求条玄关
查看原帖
tarjan84pts求条玄关
1073342
Genshin_ZFYX楼主2025/1/22 10:04

WA on #8,#16

#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int N=3005,INF=0x3f3f3f3f;
int n,p,r,a[N],h2[N];
struct Edge{
    int to,nxt;
}e[8005],e2[8005];
int head[N],tot,ans,f;
void add_edge(int u,int v)
{
    e[++tot].to=v;
    e[tot].nxt=head[u];
    head[u]=tot;
}
int num,dfn[N],low[N],st[N],top,minn[N],ind[N],cnt,scc[N];
void tarjan(int u)
{
    dfn[u]=low[u]=++num;
    st[++top]=u;
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].to;
        if(!dfn[v])
        {
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(!scc[v])low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u])
    {
        int x=N;cnt++;
        do{
            x=st[top--];
            scc[x]=cnt;
            minn[cnt]=min(minn[cnt],a[x]);
        }while(x!=u);
    }
}
void topo()
{
    queue<int>q;
    for(int i=1;i<=cnt;i++)
        if(ind[i]==0)
        {
            q.push(i);
            ans+=minn[i];
        }
    while(!q.empty())
    {
        int t=q.front();q.pop();
        for(int i=h2[t];i;i=e2[i].nxt)
        {
            minn[e2[i].to]=min(minn[e2[i].to],minn[t]);
            ind[e2[i].to]--;
            if(ind[e2[i].to]==0)q.push(e2[i].to);
        }
    }
}
signed main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin>>n;
    memset(a,0x3f,sizeof(a));
    memset(minn,0x3f,sizeof(minn));
    cin>>p;
    for(int i=1;i<=p;i++)
    {
        int id;cin>>id;
        cin>>a[id];
    }
    cin>>r;
    for(int i=1;i<=r;i++)
    {
        int u,v;cin>>u>>v;
        add_edge(u,v);
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i])tarjan(i);
    tot=0;
    for(int i=1;i<=cnt;i++)
    {
        for(int j=head[i];j;j=e[j].nxt)
        {
            int v=e[j].to;
            if(scc[i]!=scc[v])
            {
                ind[scc[v]]++;
                e2[++tot].to=scc[v];
                e2[tot].nxt=h2[scc[i]];
                h2[scc[i]]=tot;
            }
        }
    }
    topo();
    for(int i=1;i<=n;i++)
        if(minn[scc[i]]==INF)
        {
            cout<<"NO\n"<<i;
            return 0;
        }
    cout<<"YES"<<endl;
    cout<<ans<<endl;
    return 0;
}
2025/1/22 10:04
加载中...