您的位置:首页 > 其它

poj 3159 Candies(差分约束)

2012-07-22 11:13 387 查看
题意:有一包糖果,分给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
, next[M] ;
int mark
;
int dis
, q
,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
);
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: