hdu 4109 Instrction Arrangement (差分约束)

来源:互联网 发布:吉诺比利知乎 编辑:程序博客网 时间:2024/05/17 21:44

题意:

给出一些指令的拓扑序,询问最后一条指令需要多长时间

思路:

很明显给出的是 B-A>=C的形式,构造差分约束最长路最短的模型,注意加0点

#include <iostream>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <queue>#include <vector>#include <cmath>#include <stack>using namespace std;const int maxn=10005;typedef long long ll;vector<pair<int ,ll > > vec[maxn];int vis[maxn];int info[maxn];ll dis[maxn];const ll inf=0x3f3f3f3f3f3f3f3f;int n,m;int spfa(int st){    memset(info,0,sizeof(info));    memset(vis,0,sizeof(vis));    for(int i=0;i<=n;i++)    {        vis[i]=0,dis[i]=-inf,info[i]=0;    }    vis[st]=1,dis[st]=0,info[st]=1;    deque<int>q;    q.push_front(st);    int u;    while(!q.empty())    {        u=q.front();        q.pop_front();         vis[u]=0;        for(int i=0; i<vec[u].size(); i++)        {            int v=vec[u][i].first;            ll w=vec[u][i].second;            if( dis[v] < w+dis[u] )            {                dis[v]=w+dis[u];                if(!vis[v])                {                    info[v]++;                    vis[v]=1;                    if(!q.empty()&&dis[v]<dis[q.front()])                        q.push_back(v);                    else                        q.push_front(v);                    if(info[v]>n)                    {                        return 0;                    }                }            }        }    }    return 1;}int main(){    while(~scanf("%d%d",&n,&m) )    {    for(int i=0; i<=n; i++)        vec[i].clear();    int u,v;    ll w;    ///造边    for(int i=1;i<=m;i++)    {        scanf("%d%d%lld",&u,&v,&w);        vec[u].push_back(make_pair(v,w));    }    for(int i=1;i<=n;i++)        vec[0].push_back(make_pair(i,0));    ll maxx=0;    spfa(0);    for(int i=1;i<=n;i++)        maxx=max(maxx,dis[i]);    printf("%lld\n",maxx+1);    }    return 0;}


阅读全文
0 0
原创粉丝点击