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 ;
}
原文地址:https://www.cnblogs.com/misty1/p/2603533.html