Instrction Arrangement HDU - 4109(差分约束)

传送门

题意:给出n个指令,然后给出m个限制关系,然后指令之间可以并行,最后问最少要用多少时间可以把所有指令做完。

题解:首先根据安全距离建图,然后分为了好几个连通分量,找出最大的即可。

附上代码:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;

const int maxn=1e3+5;
const int maxm=1e4+5;
const int inf=0x3f3f3f3f;

int n,m,a,b,c,ans;

struct edge{
    int v,w,next;
};
edge edges[maxm];
int head[maxn],tot;

void init()
{
    memset(head,-1,sizeof(head));
    tot=0;
}

void add_edges(int u,int v,int w)
{
    edges[tot].v=v;
    edges[tot].w=w;
    edges[tot].next=head[u];
    head[u]=tot++;
}

int dist[maxn];
bool vis[maxn];

void spfa(int s)
{
    queue<int>q;
    q.push(s);
    vis[s]=true;dist[s]=0;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        ans=max(ans,dist[s]-dist[u]+1);
        vis[u]=false;
        for(int i=head[u];~i;i=edges[i].next){
            int v=edges[i].v;
            if(dist[v]>dist[u]+edges[i].w){
                dist[v]=dist[u]+edges[i].w;
                if(!vis[v]){
                    vis[v]=true;
                    q.push(v);
                }
            }
        }
    }
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF){
        ans=0;
        init();
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&a,&b,&c);
            add_edges(b,a,-c);
        }
        memset(dist,inf,sizeof(dist));
        memset(vis,false,sizeof(vis));
        for(int i=n-1;i>=0;i--){
            if(!dist[i]!=inf){
                spfa(i);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/86750465
今日推荐