zoukankan      html  css  js  c++  java
  • 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 ;
    }
  • 相关阅读:
    proc文件系统
    sysfs文件系统
    linux 下 进程和线程的区别
    Linux内核中常见内存分配函数
    内核空间与用户空间的通信方式
    DoDataExchange函数,UpdateData(TRUE)和UpdateData(FALSE)的区别
    C# 获取文件路径
    C# WinForm 中 MessageBox的使用详解
    C#对于文件操作
    线程间操作无效: 从不是创建控件的线程访问它。
  • 原文地址:https://www.cnblogs.com/misty1/p/2603533.html
Copyright © 2011-2022 走看看