zoukankan      html  css  js  c++  java
  • uva 11478(差分约束系统)

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    using namespace std;

    struct my{
      int v;
      int next;
      int dist;
    };

    const int maxn=10000;
    int adj[maxn];
    int m,n;
    my bian[maxn];
    bool inq[maxn];
    int cnt[maxn];
    int d[maxn];
    int fa;

    void init(){
      memset(bian,-1,sizeof(bian));
      memset(adj,-1,sizeof(adj));
      fa=0;
    }

    void myinsert(int u,int v,int zhi){
         bian[++fa].v=v;
         bian[fa].dist=zhi;
         bian[fa].next=adj[u];
         adj[u]=fa;
    }

    bool spfa(){
         queue<int> q;
         for (int i=1;i<=n;i++) {
            inq[i]=false;
            d[i]=0;
            cnt[i]=0;
            q.push(i);
         }
         inq[1]=true;
         while(!q.empty()){
            int u=q.front();
            q.pop();
            inq[u]=false;
            for (int i=adj[u];i!=-1;i=bian[i].next){
                int v=bian[i].v;
                if(d[v]>d[u]+bian[i].dist){
                    d[v]=d[u]+bian[i].dist;
                    if(!inq[v]){
                        q.push(bian[i].v);
                        inq[bian[i].v]=true;
                        if(++cnt[bian[i].v]>n) return true;
                    }
                }
            }
        }
        return false;
    }

    bool test(int x){
       bool tt;
       for (int i=1;i<=n;i++){
        for (int j=adj[i];j!=-1;j=bian[j].next){
            bian[j].dist-=x;
        }
       }
       tt=spfa();
        for (int i=1;i<=n;i++){
        for (int j=adj[i];j!=-1;j=bian[j].next){
            bian[j].dist+=x;
        }
       }
    return tt;
    }
    int main(){
        int u,v,zhi;
        while(scanf("%d%d",&n,&m)!=EOF){
                init();
            int l=0,r=0;
            for (int i=1;i<=m;i++){
            scanf("%d%d%d",&u,&v,&zhi);
            myinsert(u,v,zhi);
            r=max(zhi,r);
            }
            if(!test(r)){
                printf("Infinite ");
                continue;
            }
            if(test(1)) {
                    printf("No Solution ");
                    continue;
            }
            int ans=1;
            while(l<=r)
            {
                int mid=l+((r-l)>>1);
                if(test(mid))
                    r=mid-1;
                else
                {
                        l=mid+1;
                        ans=mid;
                }
            }
            printf("%d ",ans);
        }
    return 0;
    }

  • 相关阅读:
    关于SSIS中解密数据库字符串的方法
    Excel-计算年龄、工龄 datedif()
    Excel-满足指定条件并且包含数字的单元格数目,DCOUNT()
    Oracle-累加功能,累加百分比
    Oracle-一张表中增加计算某列值重复的次数列,并且把表中其他列也显示出来,或者在显示过程中做一些过滤
    mysql 实现某年单季度内的品牌TOPn销量在此年此单季度内销量占比
    mysql 分组统计、排序、取前N条记录解决方案
    mysql 除法运算保留小数的用法
    mysql 不等于 符号写法
    mysql 中@ 和 @@的区别
  • 原文地址:https://www.cnblogs.com/lmjer/p/8337507.html
Copyright © 2011-2022 走看看