zoukankan      html  css  js  c++  java
  • 图论--差分约束模板

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define INF 1e9
    using namespace std;
    const int maxn=1000+10;
    const int maxm=50000+10;
     
    struct Edge
    {
        int from,to,dist;
        Edge(){}
        Edge(int f,int t,int d):from(f),to(t),dist(d){}
    };
     
    struct BellmanFord
    {
        int n,m;
        int head[maxn],next[maxm];
        Edge edges[maxm];
        bool inq[maxn];
        int cnt[maxn];
        int d[maxn];
     
        void init(int n)
        {
            this->n=n;
            m=0;
            memset(head,-1,sizeof(head));
        }
     
        void AddEdge(int from,int to,int dist)
        {
            edges[m]=Edge(from,to,dist);
            next[m]=head[from];
            head[from]=m++;
        }
     
        int bellmanford(int s)
        {
            memset(inq,0,sizeof(inq));
            memset(cnt,0,sizeof(cnt));
            queue<int> Q;
            for(int i=1;i<=n;i++) d[i]= i==s?0:INF;
            Q.push(s);
     
            while(!Q.empty())
            {
                int u=Q.front(); Q.pop();
                inq[u]=false;
                for(int i=head[u];i!=-1;i=next[i])
                {
                    Edge &e=edges[i];
                    if(d[e.to] > d[u]+e.dist)
                    {
                        d[e.to] = d[u]+e.dist;
                        if(!inq[e.to])
                        {
                            inq[e.to]=true;
                            Q.push(e.to);
                            if(++cnt[e.to]>n) return -1;
                        }
                    }
                }
            }
            return d[n]==INF?-2:d[n];
        }
    }BF;
     
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)==2)
        {
            BF.init(n);
            while(m--)
            {
                int u,v,d;
                scanf("%d%d%d",&u,&v,&d);//转化为a-b<=val a向b连权值为val的边 
                BF.AddEdge(u,v,d);
            }
            for(int i=1;i<=n;i++)
               BF.AddEdge(0,i,0); //保证图的连通性
                    //注意特殊关系
            if(BF.bellmanford(0)!=-1) printf("%d
    ",BF.bellmanford(1));
            else puts("-1");
        }
        return 0;
    }
  • 相关阅读:
    UIScrollView设置滑动的距离
    iOS动画效果和实现
    cmd 编码 utf8
    详细的ifcfg-eth0配置详解
    Centos下 Nginx安装与配置
    linux安装目录
    utf8 和 UTF-8 的区别
    后台添加搜索功能讲解
    移动端 禁横向滚动
    PC端 $_SERVER 说明
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12798563.html
Copyright © 2011-2022 走看看