zoukankan      html  css  js  c++  java
  • 排队布局

    【题目描述】:

    当排队等候喂食时,奶牛喜欢和它们的朋友靠近些。FJ 有N头奶牛,编号从1到N,沿一条直线站着等候喂食。奶牛排在队伍中的顺序和它们的编号是相同的。因为奶牛相当苗条,所以可能有两头或者更多奶牛站在同一位置上。如果我们想象奶牛是站在一条数轴上的话,允许有两头或更多奶牛拥有相同的横坐标。一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数L。另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数D。给出ML条关于两头奶牛间有好感的描述,再给出MD条关于两头奶牛间存有反感的描述。

    你的工作是:如果不存在满足要求的方案,输出-1;如果1号奶牛和N号奶牛间的距离可以任意大,输出-2;否则,计算出在满足所有要求的情况下,1号奶牛和N号奶牛间可能的最大距离。

    【输入描述】:

    第一行读人三个整数N,ML,MD。

    接下去ML行每行有三个正整数A,B,D(1<=A<B<=N),表示奶牛A和奶牛B至多相隔D的距离。

    接下去MD行每行有三个正整数A,B,D(1<=A<B<=N),表示奶牛A和奶牛B至少相隔D的距离。

    【输出描述】:

    如果不存在满足要求的方案,输出-1;如果1号奶牛和N号奶牛间的距离可以任意大,输出-2;否则,计算出在满足所有要求的情况下,1号奶牛和N号奶牛间可能的最大距离。

    【样例输入】: 4 2 1 1 3 10 2 4 20 2 3 3

    【样例输出】: 27

    【样例说明】:

    四只牛分别在0,7,10,27。

    【时间限制、数据范围及描述】:

    时间:1s 空间:64M

    对于 30%的数据:2<=N<=50;1<=ML+MD<=300;

    对于 50%的数据:2<=N<=200;1<=ML+MD<=1000;

    对于100%的数据:2<=N<=1000;1<=ML+MD<=10,000;1<=L,D<=1,000,000

    很显然,这是一道差分约束的裸题,跑个最短路就可以了,但是出了三个数据,你还得去从0开始跑spfa判断图是不是联通的,然后就A了QAQ(我承认借鉴了一下题解)

    #include<bits/stdc++.h>
    using namespace std;
    int n,ml,md;
    struct edge
    {
        int v,to,nxt;
    }e[4010];
    int head[1010],ei=0;
    int dis[1010];
    inline void add(int x,int y,int v)
    {
        ei++;
        e[ei].to=y;
        e[ei].nxt=head[x];
        e[ei].v=v;
        head[x]=ei;
    }
    int vis[1010];
    int tag[1010];
    void spfa(int s)
    {
        int i;
        queue<int>qu;
        qu.push(s);
        vis[s]=1;
        dis[s]=0;
        while(!qu.empty())
        {
            int x=qu.front();
            vis[x]=0;
            qu.pop();
            if(tag[x]>=2*n)     
            {
                cout<<"-1";
                exit(0);
            }
            for(i=head[x];i!=0;i=e[i].nxt)
            {
                int y=e[i].to;
                if(dis[y]>dis[x]+e[i].v)
                {
                    dis[y]=dis[x]+e[i].v;
                    tag[y]=tag[x]+1;
                    if(vis[y]==0)
                    {
                        qu.push(y);
                        vis[y]++;
                    }
                }
            }
        }
    }
    int main()
    {
        int i,j;
        cin>>n>>ml>>md;
        memset(dis,0x3f,sizeof(dis));
        for(i=1;i<=ml;i++)
        {
            int x,y,l;
            scanf("%d%d%d",&x,&y,&l);
            if(x>y)
            {
                swap(x,y);
            }
            add(x,y,l);
        }
        for(i=1;i<=md;i++)
        {
            int x,y,l;
            scanf("%d%d%d",&x,&y,&l);
            if(x>y)
            {
                swap(x,y);
            }
            add(y,x,-l);
        }
        for(i=0;i<n;i++)
        {
            add(0,i,0);
        }
        spfa(0);            
        memset(dis,0x3f,sizeof(dis));
        memset(tag,0,sizeof(dis));
        spfa(1);
        if(dis[n]==0x3f3f3f3f)
        {
            cout<<"-2";
            return 0;
        }
        cout<<dis[n];
    }
  • 相关阅读:
    sql删除注意的问题
    lua创建文件
    linux部分常用命令
    已知账户和密码进行远程桌面
    excel2013超链接进不去,提示“您的组织策略不允许...”
    2019-2020-1 20199321《Linux内核原理与分析》第七周作业
    《深入理解计算机系统》第一章读书笔记 20199321
    《文献管理与信息分析》速读笔记
    《深入理解计算机系统》速读笔记
    《构建之法现代软件工程》速读笔记
  • 原文地址:https://www.cnblogs.com/hrj1/p/11129111.html
Copyright © 2011-2022 走看看