zoukankan      html  css  js  c++  java
  • codevs4416 FFF 团卧底的后宫

    题目描述 Description

    你在某日收到了 FFF 团卧底的求助,在他某日旅游回来,他的后宫们出现了一些不可调和的矛盾,如果 FFF 团卧底把自己的宝贝分给 a 号妹子,那么 b 号妹子至少要在站在 a 号妹子的右边距离 d,妹子才愿意得到那个宝贝。可是后宫里也有玩得好的妹子呀,她们总是渴望亲近一点,如果把自己的宝贝分给 a 号妹子,那么与她亲近的妹子与 a 号妹子的距离不会超过 l。现在总共有 n 个妹子,k 个这样的矛盾关系,m 个亲近关系。假设他的宝贝是无限的,保证每一个妹子都有宝贝的情况下,第 n 个妹子和第一个妹子的最远距离是多少呢?

    输入描述 Input Description

    第一行为 n,m,k

    此后 m 行为亲近关系

    此后 k 行为矛盾关系

    输出描述 Output Description

    一行,为最长的距离

    样例输入 Sample Input

    4 2 1

    1 3 100

    2 4 200

    2 3 33

    样例输出 Sample Output

    267

    数据范围及提示 Data Size & Hint

    对于 40%的数据,n<=100

    对于 100%的数据,n<=1000,m<=10000,从 1 开始编号,距离在 int 范围内

    //copy
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <vector>
    #include <queue>
    
    using namespace std;
    
    vector < int > linker[1000 + 2];
    vector < int > di[1000 + 2];
    int dist[1000 + 2];
    bool use[1000 + 2];
    int n , a , b;
    int x , y , z;
    int inq[1000 + 2];
    
    inline int spfa()
    {
        queue < int > q;
        q.push( 1 );
        int now , i , cur , v;
        for( i = 1 ; i <= n ; i++ )
             dist[i] = 10000000;
        dist[1] = 0;
        inq[1]++;
        while( !q.empty() )
        {
            now = q.front();
            q.pop();
            use[ now ] = 0;
            for( i = 0 ; i < linker[ now ].size() ; i++ )
            {
                 cur = linker[ now ][i];
                 v = di[ now ][i];
                 if( dist[ cur ] > dist[ now ] + v )
                 {
                     dist[ cur ] = dist[ now ] + v;
                     if( !use[ cur ] )
                     {
                         use[ cur ] = 1;
                         q.push( cur );
                         inq[ cur ]++;
                         if( inq[ cur ] > n ) return -1;
                     }
                 }
            }
        }
        return dist[n];
    }
    int i;
    
    int main()
    {
        scanf( "%d %d %d" , &n , &a , &b );
        while( a-- )
        {
            scanf( "%d %d %d" , &x , &y , &z );
            linker[x].push_back( y );
            di[x].push_back( z );
        }
        while( b-- )
        {
            scanf( "%d %d %d" , &x , &y , &z );
            linker[y].push_back( x );
            di[y].push_back( -z );
        }
        int ans = spfa();
        if( ans == 10000000 ) cout << -2 << endl;
        else cout << ans << endl;
        return 0;
    }
  • 相关阅读:
    NSGA3理解(NSGA3算法及其MATLAB版本实现)
    基于分解的多目标进化优化MOEA/D之切比雪夫方法代码
    基于分解的多目标进化优化MOEA/D三种聚合函数的理解
    NSGA-II in MATLAB 源码中文注释(1)(转载)
    我的个人总结
    Unity Networking API文档翻译(二):The High Level API
    Unity Networking API文档翻译(一):Networking概述
    Unity3D独立游戏开发日记(二):摆放建筑物
    Unity3D独立游戏开发日记(一):动态生成树木
    如何申请TexturePacker
  • 原文地址:https://www.cnblogs.com/hyfer/p/5852376.html
Copyright © 2011-2022 走看看