RE,分层图,前向星,spfa
查看原帖
RE,分层图,前向星,spfa
480154
lvclengai楼主2023/7/28 23:10

感觉思路挺清晰的,就是过不了,调了好久,求大佬助我脱离苦海

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=1510000,inf=2147483647;
int n,m,a[maxn],cnt=0;
int h[maxn],to[maxn],val[maxn],nxt[maxn],dis[maxn];
bool vis[maxn];
void add(int a,int b,int c)
{
    to[++cnt]=b;
    val[cnt]=c;
    nxt[cnt]=h[a];
    h[a]=cnt;
}
queue<int>q;
void spfa()
{
    for(int i=1;i<=3*n;i++)
    {
        dis[i]=inf;
    }
    dis[1]=0;vis[1]=1;q.push(1);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=h[u];i;i=nxt[i])
        {
            if(dis[to[i]]>(long long)dis[u]+val[i])
            {
                dis[to[i]]=dis[u]+val[i];
                if(!vis[to[i]])
                {
                    q.push(to[i]);
                    vis[to[i]]=1;
                }
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",a[i]);
        add(i,i+n,a[i]);
        add(i+n,i+2*n,-a[i]);
    }
    for(int i=1,u,v,w;i<=m;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        if(w==1)
        {
            add(u,v,0);
            add(u+n,v+n,0);
            add(u+2*n,v+2*n,0);
        }
        else
        {
            add(u,v,0);
            add(u+n,v+n,0);
            add(u+2*n,v+2*n,0);
            add(v,u,0);
            add(v+n,u+n,0);
            add(v+2*n,u+2*n,0);
        }
    }
    spfa();
    int ans=inf;
    for(int i=1;i<=n;i++)
    {
        ans=min(dis[2*n+i],ans);
    }
    cout<<-ans;
    return 0;
}
2023/7/28 23:10
加载中...