1042 布局 Layout 最大值差分约束 判断负环

 链接:https://ac.nowcoder.com/acm/contest/26077/1042
来源:牛客网

题目描述

FJ有N头奶牛(2≤N≤1000)(2 \leq N \leq1000)(2N1000),编号为1…N1 \ldots N1N。奶牛们将按照编号顺序排成一列队伍(可能有多头奶牛在同一位置上)。换句话说,假设i号奶牛位于P ⁣  iP_{ \! \;i}Pi,则P 1≤P 2≤…≤P ⁣  NP_{ \,1} \leq P_{ \,2} \leq \ldots \leq P_{ \! \;N}P1P2PN
有些奶牛是好基友,它们希望彼此之间的距离小于等于某个数。有些奶牛是情敌,它们希望彼此之间的距离大于等于某个数。
给出MLM_LML对好基友的编号,以及它们希望彼此之间的距离小于等于多少;又给出MDM_DMD对情敌的编号,以及它们希望彼此之间的距离大于等于多少(1≤ML,(1 \leq M_L,(1ML,MD≤104)M_D \leq 10^4)MD104)。
请计算:如果满足上述所有条件,1号奶牛和N号奶牛之间的距离(P ⁣  N−P 1P_{ \! \;N}-P_{ \,1}PNP1)最大为多少。

输入描述:

第一行:三个整数N,ML,MDN,M_L,M_DN,ML,MD,用空格分隔。
2…ML+12 \dots M_L+12ML+1行:每行三个整数A,B,D,用空格分隔,表示PA−PB≤DP_A-P_B \leq DPAPBD。
ML+2…ML+MD+1M_L+2 \dots M_L+M_D+1ML+2ML+MD+1行:每行三个整数A,B,D,用空格分隔,表示PA−PB≥DP_A-P_B \geq DPAPBD。
保证1≤A<B≤N,1 \le A<B \le N,1A<BN,1≤D≤1061 \leq D \leq10^61D106.

输出描述:

一行,一个整数。如果没有合法方案,输出-1\texttt{-1}-1.如果有合法方案,但1号奶牛可以与N号奶牛相距无穷远,输出-2\texttt{-2}-2.否则,输出1号奶牛与N号奶牛间的最大距离。
示例1

输入

复制
4 2 1
1 3 10
2 4 20
2 3 3

输出

复制
27

说明

这四头牛分别位于0,7,10,27。

备注:

对于全部数据,2≤N≤1000,1≤ML,MD≤104,1≤L,D≤1062 \leq N \leq 1000,1 \leq M_L,M_D \leq 10^4,1 \leq L,D \leq 10^62N1000,1ML,MD104,1L,D106。

分析

差分约束的最大值问题

就得想到每个最大值的上界最小。

所以公式就是a <= b + d。add(a,b,d)

 

第一问问能不能实现,就是在判断有没有负环,将所有点放入队列中去判断有没有环就可以了

第二问问是不是无穷远,只用从 1 开始跑 spfa 差分约束就可以了。

第三问同理

//-------------------------代码----------------------------

//#define int ll
const int N = 1e5+10;
int n,ml,md;
V<pii>e[N];
int dist[N],cnt[N];
bool vis[N];


bool spfa(int size) {
    ms(dist,0x3f);
    ms(vis,0);
    
    queue<int> q;
    fo(i,1,size) {
        q.push(i);
        dist[i] = 0;
        vis[i] = 1;
    }
    
    
    while(q.size()) {
        auto tmp = q.front();q.pop();
        vis[tmp] = 0;
        for(auto it:e[tmp]) {
            int j = it.first,w = it.second;
            if(dist[j] > dist[tmp] + w) {
                dist[j] = dist[tmp] + w;
                cnt[j] = cnt[tmp] + 1;
                if(cnt[j] == n) return 1;
                if(!vis[j]) {
                    vis[j] = 1;
                    q.push(j);
                }
                
            }
        }
    }
    return 0;
}

void solve()
{
    cin>>n>>ml>>md;
    fo(i,1,ml) {
        int a,b,c;cin>>a>>b>>c;
        if(a > b) swap(a,b);
        e[a].pb({b,c});
    }
    fo(i,1,md) {
        int a,b,c;cin>>a>>b>>c;
        if(a > b) swap(a,b);
        e[b].pb({a,-c});
    }
    if(spfa(n)) cout<<-1<<endl;
    else {
        spfa(1);
        if(dist[n] == inf) cout<<-2<<endl;
        else cout<<dist[n]<<endl;
    }
}
void main_init() {}
signed main(){
    AC();clapping();TLE;
    cout<<fixed<<setprecision(12);
    main_init();
//  while(cin>>n,n)
//  while(cin>>n>>m,n,m)
//    int t;cin>>t;while(t -- )
    solve();
//    {solve(); }
    return 0;
}

/*样例区


*/

//------------------------------------------------------------

 

posted @ 2022-08-24 01:17  er007  阅读(38)  评论(0编辑  收藏  举报