Layout -拆分约束+负环

  • Layout

  •  POJ - 3169 
  • 转自:https://blog.csdn.net/mengxiang000000/article/details/52613328
  • 注意图是单向的
  • 差分约束系统问题,能够将问题转化为最短路问题。以下给出转化过程: 假设有这样的三个条件: 那么我们可以将不等式1和不等式2相加得到: 那么如果想要得到x1和x3的最大差值,那么其实就是取min(k1+k2,k3);
  • 对应ml条信息: ①牛A和牛B的距离不想超过D,那么建立不等式:posA-posB=D,那么我们左右两边同乘-1有:posB-posA<=-D,那么加入到图中add(B,A,-D)即可。 4、图建立好之后直接跑最短路即可。 对应输出: ①如果dis【n】==inf,输出-2; ②否则输出dis【n】; ③如果在跑SPFA过程中发现了负环,说明问题无解,那么输出-1. 
  • #include <iostream>
    #include <cstring>
    #include <queue>
    #include <stdio.h>
    using namespace std;
    #define maxn 1333
    #define inf 0x3f3f3f3f
    int mmp[maxn][maxn],k,v;
    int dis[maxn],n,ml,md,u;
    int vis[maxn],book[maxn];
    void spfa()
    {
        queue<int>q;
        dis[1]=0;
        q.push(1);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            book[u]++;
            if(book[u]>n)
            {
                cout<<"-1"<<endl;
                return;
            }
            for(int i=1; i<=n; i++)
            {
                if(dis[i]>dis[u]+mmp[u][i])
                {
                    dis[i]=dis[u]+mmp[u][i];
                    if(!vis[i])
                    {
                        vis[i]=1;
                        q.push(i);
                    }
                }
            }
        }
        if(dis[n]==inf)
            cout<<-2<<endl;
        else
            cout<<dis[n]<<endl;
        return ;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>n>>ml>>md;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                mmp[i][j]=inf;
                if(i==j)
                    mmp[i][j]=0;
                vis[i]=book[i]=0;
                dis[i]=inf;
            }
        while(ml--)
        {
            cin>>u>>v>>k;
            mmp[u][v]=k;
        }
        while(md--)
        {
            cin>>u>>v>>k;
            mmp[v][u]=-k;
        }
        spfa();
        return 0;
    }
    

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/82827269