题意:农民john有N快田,M条路,w个虫洞,虫洞的功能回到多少分钟之前。
思路:想法很简单,将w个虫洞的值存为负值,然后求图中是否有负环路,如果有就输出“YES”,否则输出“NO”。但是题目中有重复的路要滤除,还有这题有连接表存储比用邻接矩阵存储有简单。
代码:
View Code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <math.h> #define N 505 #define INF 10006 using namespace std ; struct node { int s , e , v ; }p[10004] ; int num ; void add( int x , int y , int z ) { p[num].s = x ; p[num].e = y ; p[num].v = z ; num++ ; } int main() { int cas , n , m , w ; int x, y , z ,i , j ; int dis[N] ; scanf ( "%d" , &cas ); while ( cas-- ) { scanf ( "%d%d%d" , &n , &m , &w ); for ( i = 1 ; i <= n ; i++ ) { dis[i] = INF ; } num = 0 ; for ( i = 1 ; i <= m ; i++ ) { scanf ( "%d%d%d" , &x , &y , &z ) ; add( x , y , z ) ; add( y , x , z ) ; } for ( i = 1 ; i <= w ; i++ ) { scanf ( "%d%d%d" , &x , &y , &z ) ; add( x , y , -z ) ; } dis[1] = 0 ; for ( i = 1 ; i < n ; i++ ) for ( j = 0 ; j < num ; j++ ) if ( dis[p[j].e] > dis[p[j].s] + p[j].v ) { dis[p[j].e] = dis[p[j].s] + p[j].v ; } int flag = 0 ; for ( i = 0 ; i < num ; i++ ) if ( dis[p[i].e] > dis[p[i].s] + p[i].v ) { flag = 1 ; break ; } if ( flag ) printf ( "YES\n" ); else printf ( "NO\n" ); } return 0 ; }