50pts未解决,求大佬帮看
查看原帖
50pts未解决,求大佬帮看
178804
太阳起晚了呢楼主2021/9/23 14:06
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6+5;
const int maxx=36501;
struct node
{
    int v,next;
}e[maxn];
int cnt,head[maxn],dfn[maxn],low[maxn],col[maxn],vis[maxn],tim,n,m,x[maxn],y[maxn],tot,ind[maxn],f[maxn],ans,sz[maxn];
bool b[maxn];
void add(int u,int v)
{
    e[++cnt].next=head[u];
    e[cnt].v=v;
    head[u]=cnt;
}
stack<int >s;
void tarjan(int u)
{
    bool flag=0;
    dfn[u]=low[u]=++tim;
    s.push(u);vis[u]=1;
    for(int i=head[u];i;i=e[i].next)
    {
        int v=e[i].v;
        if(u==v) flag=1;
        if(!dfn[v]) {tarjan(v);low[u]=min(low[u],low[v]);}
        else if(vis[v]) low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u])
    {
        int x=0;tot++;
        if(flag || s.top()!=u) b[tot]=1;
        while(x!=u)
        {
            x=s.top();s.pop();vis[x]=0;
            col[x]=tot;sz[tot]++;
        }
    }
}
queue<int >q;
void topu_sort()
{
    f[col[n]]=1;
    for(int i=1;i<=tot;i++) if(ind[i]==0) q.push(i);
    while(q.size())
    {
        int u=q.front();q.pop();
        if(u==col[n]) continue;
        for(int i=head[u];i;i=e[i].next)
        {
            int v=e[i].v;
            ind[v]--;
            if(!ind[v]) q.push(v);
        }
    }
    q.push(col[n]);
    while(q.size())
    {
        int u=q.front();q.pop();
        if(b[u] && f[u]) f[u]=maxx;
        for(int i=head[u];i;i=e[i].next)
        {
            int v=e[i].v;
            f[v]=min(maxx,f[v]+f[u]);
            ind[v]--;
            if(!ind[v]) q.push(v);
        }
    }
}
void input()
{
    scanf("%d%d",&n,&m);n++;
    int u,v;
    for(int i=1;i<=m;i++) {scanf("%lld%lld",&x[i],&y[i]);add(y[i],x[i]);}
}
void rebuild()
{
    memset(head,0,sizeof(head));
    memset(e,0,sizeof(e));
    cnt=0;
    for(int i=1;i<=m;i++)
    {
        if(col[x[i]]!=col[y[i]]) add(col[y[i]],col[x[i]]);
        ind[col[x[i]]]++;
    }
}
void getans()
{
    int sum=0;
    //for(int i=1;i<=tot;i++) cout<<f[i]<<endl;
    for(int i=1;i<=tot;i++) ans=max(ans,f[i]);
    if(ans==maxx) printf("zawsze\n");
    else printf("%lld\n",ans);
    if(ans==f[col[n]]) sum--;
    for(int i=1;i<=tot;i++) if(ans==f[i])sum+=sz[i];
    printf("%lld\n",sum);
    for(int i=1;i<n;i++)
        if(f[col[i]]==ans) printf("%lld ",i);

}
void work()
{
    for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
    rebuild();
    topu_sort();
    getans();
}
void pp()
{
    for(int i=1;i<=n;i++) cout<<col[i]<<endl;
}
signed main()
{
    input();
    work();
    //pp();
    printf("\n");
    return 0;
}
2021/9/23 14:06
加载中...