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;
}

 

posted @ 2016-09-08 11:17  ACforever  阅读(233)  评论(0编辑  收藏  举报