洛谷—— P1260 工程规划

 P1260 工程规划

 

又遇到一道水题,差分约束,emmmm

蒟蒻都感觉有点儿套路了,对于这类不动脑也可以A掉的题

 

洛谷——P3275 [SCOI2011]糖果

和上一题一样,$T_i-T_j≤b$,也就是$T_i-b≤T_j$

那么就连一条$i$到$j$权值为$-b$的路径

比较套路的是你要确定一个原图中不存在的点,来向原图中的点连一条权值为0的边来更新他

 

最后,$Spfa$判负环,判断是否有解。

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

#define N 1000000
#define inf 0x7fffffff
using namespace std;

int n,m,tot,head[N];
struct nodE{
    int to,next,w;
}e[N];

void add(int u,int v,int w){
    e[++tot].to=v,e[tot].next=head[u],head[u]=tot,e[tot].w=w;
}

struct npdE{
    int to,dis;
    bool operator < (npdE x)const{
        return dis>x.dis;
    }
};
queue<npdE>Q;
int d[N],in[N];
bool vis[N];
void spfa(){
    fill(d+1,d+1+n,-inf);
    d[0]=0;
    Q.push((npdE){0,0});
    vis[0]=1;
    while(!Q.empty()){
        int u=Q.front().to;Q.pop();vis[u]=0;
        if(in[u]>n){puts("NO SOLUTION");exit(0);}
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].to;
            if(d[v]<d[u]+e[i].w){
                d[v]=d[u]+e[i].w;
                if(!vis[v]) in[v]=in[u]+1,vis[v]=1,Q.push((npdE){v,d[v]});
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int u,v,w,i=1;i<=m;i++){
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,-w);
    }
    for(int i=1;i<=n;i++) add(0,i,0); 
    spfa();
    int mi_n=inf;
    for(int i=1;i<=n;i++) mi_n=min(mi_n,d[i]);
    for(int i=1;i<=n;i++) printf("%d\n",d[i]-mi_n);
    
    return 0;
}

 

posted @ 2018-10-13 22:17  清风我已逝  阅读(343)  评论(0编辑  收藏  举报