用链式前向星存边结果只过了第2、6、8、10个点的屑萌新求救
查看原帖
用链式前向星存边结果只过了第2、6、8、10个点的屑萌新求救
491637
fu_dan_de_zhu楼主2023/2/4 23:51

大神救命们,我没用结构体数组存边,我写的链式前向星,最后是把n个点的所有邻边都跑了一遍再重新建图然后跑拓扑,只过了2、6、8、10四个点

实在是调不出来了……QAQ

下面是代码

#include<bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int N = 100010;

stack<int> s;
int dfn[N],low[N];
int h[N],e[N],ne[N],idx;
int hh[N],ee[N],nee[N],idxx;
int id[N];
bool st[N];
int timestamp;
int w[N];//存边权
int dist[N];
int in[N];//存入度
queue<int> q;
int n,m;

void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

void addd(int a,int b)
{
    ee[idxx]=b,nee[idxx]=hh[a],hh[a]=idxx++;
}

void tarjan(int u)
{
    dfn[u]=low[u]=++timestamp;
    s.push(u);
    st[u]=1;
    for(int i=h[u];~i;i=ne[i])
    {
        int j=e[i];
        if(!dfn[j]) 
        {
            tarjan(j);
            low[u]=min(low[u],low[j]);
        }
        else if(st[j])
        {
            low[u]=min(low[u],dfn[j]);
        }
    }
    if(dfn[u]==low[u])
    {
        int y;
        while(y=s.top())
        {
            s.pop();
            st[y]=0;
            id[y]=u;
            if(y==u)
            {
                break;
            }
            w[u]+=w[y];
        }
    }
}

int tp()//拓扑
{
    for(int i=1;i<=n;i++)
    {
        if(id[i]==i&&!in[i])
        {
            q.push(i);
            dist[i]=w[i];
        }
    }
    while(!q.empty())
    {
        int t=q.front();
        q.pop();
        for(int i=hh[t];~i;i=nee[i])
        {
            int j=ee[i];
            dist[j]=max(dist[j],dist[t]+w[j]);
            in[j]--;
            if(in[j]==0)
            {
                q.push(j);
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,dist[i]);
    }
    return ans;
}

int main()
{
    //start your program!
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof(h));
    memset(hh,-1,sizeof(hh));
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&w[i]);
    }
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b); 
    }
    for(int i=1;i<=n;i++)
    {
        if(!dfn[i])
        {
            tarjan(i);
        }
    }
    for(int i=1;i<=n;i++)//重建图
    {
        for(int j=hh[i];~j;j=nee[j])
        {
            int k=ee[j];
            if(id[i]!=id[k])
            {
                addd(i,k);
                in[k]++;
            }
        }
    }
    printf("%d",tp());
    return 0;
}

求救qwq

2023/2/4 23:51
加载中...