您的位置:首页 > 其它

查分约束的总结

2009-01-09 18:45 113 查看
在做了几道查分约束的题目后终于找到一点感觉了。查分约束就是把形式类似于:
 A[i1] - A[j1] <= X1
 A[i2] - A[j2] <= X2
 ....
的方程全部列写出来,把A[i]作为源点,A[j]作为末点,X作为权,把边全部放入数组中进行Bellman-Ford。至于初始化和判断条件看具体的情况。
下面是一道例题poj的3159:
#include <stdio.h>
#include <memory.h>
#define N 30010
#define M 150010
#define NIL 99999999
int next[M];
int v[M];
int w[M];
int first
;
int d
;
int n,m;
void input()
{
    int i,x,y,xy;
    scanf("%d%d",&n,&m);
    for(i = 1; i <= m; i++) {
        scanf("%d%d%d",&x,&y,&xy);
        next[i] = first[x];
        v[i] = y;
        w[i] = xy;
        first[x] = i;
    }
}
int BF()
{
    int i;
    bool in
;
    int stack
,top=0,a,p;
    for(i = 1; i <=n;i++)
        d[i]=NIL;
    memset(in,false,sizeof(in));
    d[1] = 0;
    stack[top++]=1;
    in[1]=true;
    while(top){
        a=stack[--top];
        in[a]=false;
        p=first[a];
        while(p) {
            if( d[a] + w[p] < d[v[p]]) {
                d[v[p]] = d[a] + w[p];
                if(!in[v[p]]) {
                    in[v[p]]=true;
                    stack[top++]=v[p];
                }
            }
            p=next[p];
        }
    }
    return d
;
}
int main()
{
        input();
        printf("%d/n",BF());
    return 0;
}
懒得写了,呵呵。刷题去~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: