bzoj2019

本文介绍了一种使用SPFA算法求解最长路径的问题。通过将边权转换为最大值减去边权的方式,实现从指定起点到所有其他点的最长路径计算。代码实现了加边、SPFA算法,并考虑了负权回路的情况。

分析:把边权用d减去然后跑最长路就好了。

#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#define inf 1000000000  
#define maxn 1010  
using namespace std;  

int head[maxn],next[maxn],to[maxn],len[maxn],dis[maxn],q[maxn],cnt[maxn];  
bool vis[maxn],flag;  
int n,m1,num,s,d,m2;  

void addedge(int x,int y,int z)  
{  
    num++;to[num]=y;len[num]=z;next[num]=head[x];head[x]=num;  
}  

void spfa()  
{  
    for (int i=1;i<=n;i++) dis[i]=-inf;  
    dis[s]=d;  
    int l=0,r=1;  
    q[1]=s;vis[s]=1;  
    while (l!=r)  
    {  
        l++;if (l==maxn) l=0;  
        int x=q[l];cnt[x]++;  
        for (int p=head[x];p;p=next[p])  
          if (dis[x]+len[p]>dis[to[p]])  
          {  
            dis[to[p]]=dis[x]+len[p];  
            if (!vis[to[p]])  
            {  
                if (cnt[to[p]]==n) {flag=1;return;}  
                r++;if (r==maxn) r=0;  
                q[r]=to[p];vis[to[p]]=1;  
            }  
          }  
        vis[x]=0;  
    }  
}  

int main()  
{  
    scanf("%d%d%d%d%d",&d,&m1,&n,&m2,&s);  
    for (int i=1;i<=m1;i++)  
    {  
        int x,y;  
        scanf("%d%d",&x,&y);  
        addedge(x,y,d);  
    }  
    for (int i=1;i<=m2;i++)  
    {  
        int x,y,z;  
        scanf("%d%d%d",&x,&y,&z);  
        addedge(x,y,d-z);  
    }  
    spfa();  
    if (flag) printf("-1\n");  
    else   
    {  
        int mx=-inf;  
        for (int i=1;i<=n;i++) mx=max(mx,dis[i]);  
        printf("%d\n",mx);  
    }  
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值