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