现在的位置: 首页 > 算法 > 正文

poj1201差分系统

2019年02月09日 算法 ⁄ 共 1064字 ⁄ 字号 评论关闭

差分约束系统:

1.输入的边

2.每个相邻点的边

3.每个点与源点的边

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x7fffffff
#define maxn 50005
using namespace std;
struct  node
{
    int v,c;
};
vector<node>g[maxn];
int t;
int s,e;
int sum[maxn];
int dis[maxn],vis[maxn];
void add(int u,int v,int c)
{
    node p;
    p.v=v,p.c=c;
    g[u].push_back(p);
}

bool spfa()
{
    int u,v;
    queue<int>q;
    for(int i=s; i<=e; i++) dis[i]=-INF;
    memset(vis,0,sizeof(vis));
    memset(sum,0,sizeof(sum));
    dis[s-1]=0;
    vis[s-1]=1;
    q.push(s-1);
    while(!q.empty())
    {
        u=q.front(),q.pop();
        for(int i=0; i<g[u].size(); i++)
        {
            int v=g[u][i].v,c=g[u][i].c;
            if(dis[v]<dis[u]+c)
            {
                dis[v]=dis[u]+c;
                //printf("%d\n",dis[v]);
                if(!vis[v])
                {
                    vis[v]=1;
                    sum[v]++;
                    if(sum[v]>(e-s+1))
                        return 0;
                    q.push(v);
                }
            }
        }
        vis[u]=0;
    }
    return 1;
}

int main()
{
    int a,b,c;
    while(scanf("%d",&t)!=EOF)
    {
        s=INF,e=-1;
        for(int i=0;i<maxn;i++)
        {
            g[i].clear();
        }
        while(t--)
        {
            scanf("%d%d%d",&a,&b,&c);
            add(a-1,b,c);
            if(e<b)
                e=b;
            if(s>a)
                s=a;
        }
        for(int i=s; i<=e; i++)
        {
            add(i-1,i,0);
            add(i,i-1,-1);
        }
        for(int i=s; i<=e; i++)
        {
            add(s-1,i,0);
        }
        spfa();
        //printf("%d %d\n",s,e);
        //printf("%d %d\n",dis[e],dis[s-1]);
        printf("%d\n",dis[e]-dis[s-1]);
    }
    return 0;
}


抱歉!评论已关闭.