poj 3159 Candies(差分约束)
题意:有一包糖果,分给N个孩子,有些孩子可以比另一些孩子多,但是不能躲过ci个,给出m对 A B ci,意思是孩子B比孩子A多不超过ci个。
思路:其实就是一道裸差分约束,但是这题卡时间,看了discuss里的讨论,说是边比点多,用Dij比较快,又看了一下点的数据范围,果断用了数组模拟的邻接表,然后。。。。。就AC
还有一点就是如果要把一个数初始化为无穷大,最好是INF=100000000 ,而不要INF=0xffff,因为后面一种INF的值为65536,有时不够大。。。
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> #include <math.h> #define N 30005 #define M 150005 #define INF 100000000 using namespace std ; struct node { int e ; int v ; }p[M] ; int node[N] , next[M] ; int mark[N] ; int dis[N] , q[N] ,top ; int cnt , n , m ; void add ( int s , int e , int v ) { p[cnt].e = e ; p[cnt].v = v ; next[cnt] = node[s] ; node[s] = cnt++ ; } int Relax( int s , int e , int v ) { if ( dis[s] + v < dis[e] ) { dis[e] = dis[s] + v ; return 1 ; } return 0 ; } int Bellman_ford( int s0 ) { int i , j , k , t ; for ( i = 1 ; i <= n ; i++) dis[i] = INF ; dis[s0] = 0; top = 0 ; q[top++] = s0 ; mark[s0] = 1 ; while ( top ) { t = q[--top] ; mark[t] = 0 ; k = node[t] ; while ( k != -1 ) { if ( Relax ( t , p[k].e , p[k].v ) && !mark[p[k].e] ) { q[top++] = p[k].e ; mark[p[k].e] = 1 ; } k = next[k] ; } } return 1 ; } int main() { int i , j , k , x , y , z ; scanf ( "%d%d" , &n , &m ); cnt = 0 ; memset( node , -1 , sizeof ( node )); for ( i = 0 ; i < m ; i++ ) { scanf ( "%d%d%d" , &x , &y , &z ); add ( x , y , z ); } Bellman_ford ( 1 ); printf ( "%d\n" , dis[n] ); return 0 ; }