洛谷—— 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; }
博主蒟蒻,若有出错的地方,敬请指出。
如有侵犯您版权的地方,请快速联系我,我会撤回本博文。