• POJ 1201 Intervals


    差分约束


    题意倒是简单。难的是建立约束(建边)。能够初始化INF求最小。然后输出-dis[maxn]。也能够初始化-INF求最大,输出dis[maxn]。

    求最大的时候:

    minn为最小。maxn为最大。

    输入 u ,v len  建立约束为 u->v = len。最后在 minn和maxn之间还要建立 i->i-1=-1 , i-1->i=0。

    最后求minn-1 ~maxn 的最大距离。


    求最小就是 建边不变,距离变负。


    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<map>
    #include<stack>
    #include<iostream>
    #include<list>
    #include<set>
    #include<cmath>
    #define INF 0x7fffffff
    #define eps 1e-6
    #define LL long long
    using namespace std;
    int n,maxn,minn,m;
    struct lx
    {
        int v,len;
    };
    vector<lx>g[51001];
    
    queue<int>q;
    
    void SPFA()
    {
        bool vis[51001];
        int dis[51001];
        for(int i=0;i<=maxn;i++)
            vis[i]=0,dis[i]=-INF;
        vis[minn-1]=1,dis[minn-1]=0;
        q.push(minn-1);
    
        while(!q.empty())
        {
            int u=q.front();q.pop();
            vis[u]=0;
            for(int j=0;j<g[u].size();j++)
            {
                int v=g[u][j].v;
                int len=g[u][j].len;
    //            printf("v=%d,u=%d:%d>%d+%d=
    ",v,u,dis[v],dis[u],len);
    //                system("pause");
                if(dis[v]<dis[u]+len)
                {
                    dis[v]=dis[u]+len;
    
                    if(!vis[v])
                    {
                        vis[v]=1;
                        q.push(v);
                    }
                }
            }
        }
        printf("%d
    ",dis[maxn]);
    //    for(int i=minn-1;i<=maxn;i++)
    //        printf("%d : %d ==
    ",i,dis[i]);
    }
    int main()
    {
        while(scanf("%d",&m)!=EOF)
        {
            minn=INF,maxn=0;
            for(int i=0;i<51001;i++)
                g[i].clear();
            int u,v,len;
            lx now;
            while(m--)
            {
                scanf("%d%d%d",&u,&v,&len);
                maxn=max(maxn,v);
                minn=min(minn,u);
                now.v=v,now.len=len;
                g[u-1].push_back(now);
            }
            for(int i=minn;i<=maxn;i++)
            {
                now.v=i-1,now.len=-1;
                g[i].push_back(now);
                now.v=i,now.len=0;
                g[i-1].push_back(now);
            }
    //        for(int i=minn-1;i<=maxn;i++)
    //        {
    //            printf("%d-> ",i);
    //            for(int j=0;j<g[i].size();j++)
    //                printf("%d:%d  ",g[i][j].v,g[i][j].len);
    //            printf("
    ");
    //        }
            while(!q.empty())q.pop();
            SPFA();
        }
    }
    


  • 相关阅读:
    从头编写 asp.net core 2.0 web api 基础框架 (1)
    希腊字母表
    Python数据分析(二): Numpy技巧 (4/4)
    Python数据分析(二): Numpy技巧 (3/4)
    Python数据分析(二): Numpy技巧 (2/4)
    OLED液晶屏幕(3)串口读取文字并分割
    OLED液晶屏幕(2)取模软件
    OLED液晶屏幕(0)自动获取12ic地址液晶屏幕
    OLED液晶屏幕(1)OLED液晶屏幕ssd1306驱动芯片 arduino运行 ESP8266-07可以 12f不可以
    I2C 连接 12864 OLED 屏幕
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6878701.html
Copyright © 2020-2023  润新知