题意: 给定n个点(点权未知)和m条信息:u的权值>=v的权值+w 求点权的极小解和极大解(无解则输出-1)

极小解即每个点的点权可能的最小值 极大解即每个点的点权可能的最大值

题解: 差分约束系统

对于val[u]>=val[v]+w 要得到极小解,v是没有受限制的,其最小值为0 而u受到v的限制,显然,val[u]的最小值就是val[v]+w

在多条件限制下,我们用v连向u边权为w的边表示每个限制条件val[u]>=val[v]+w 那么如果得到的是拓扑图,则按拓扑序求到每个点的最长路,就得到极小解

如果得到的不是拓扑图,即图中存在回路 那么如果存在回路边权和>0,则无解(成立的前提是边权都是大于等于零的)

总的来说,求极小解的做法就是,先对val[u]>=val[v]+w建立v连向u边权为w的边 对得到的图求强连通分量,将每个强连通分量缩成一个点 若存在边权和>0的强连通分量,则无解

否则在缩点后的拓扑图上,从入度为0的点出发按拓扑序求到每个点的最长路 该最长路就是每个点的最小值

不缩点直接判是否有回路,没有回路再拓扑,这样做会出错 因为会有边权和为0的强连通分量

对于求极大解,则将条件写成val[v]<=val[u]-w的形式 建立u连向v边权为-w的边,同样求强连通分量并缩点 在缩点后的拓扑图上做最短路,该最短路就是每个点的最大值

差分约束系统如果要求最优解而非合法解,并且整个图不能转化成从某个特定点出发的话。需要进行缩点+拓扑排序……往往只在边权都大于零或者都小于零的时候才成立。

因为对于多起点的情况而言,spfa判负环是失效的,互相制约的关系也很难通过添加虚拟结点来弥补。

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int us[1000010],vs[1000010],ws[1000010];
struct Edge{int v,w;
};
vector<Edge>G[100010];
vector<int>rG[100010],tv;
bool used[100010];
int cmp[100010];
int ru[100010],f[100010],ansa[100010];
int n,m;
void AddEdge(int U,int V,int W){G[U].push_back((Edge){V,W});rG[V].push_back(U);
}
void dfs(int U){used[U]=1;for(int i=0;i<G[U].size();++i){if(!used[G[U][i].v]){dfs(G[U][i].v);}}tv.push_back(U);
}
void rdfs(int U,int K){used[U]=1;cmp[U]=K;for(int i=0;i<rG[U].size();++i){if(!used[rG[U][i]]){rdfs(rG[U][i],K);}}
}
int scc(){memset(used,0,sizeof(used));tv.clear();for(int i=1;i<=n;++i){if(!used[i]){dfs(i);}}memset(used,0,sizeof(used));int K=0;for(int i=tv.size()-1;i>=0;--i){if(!used[tv[i]]){rdfs(tv[i],++K);}}return K;
}
int main(){int x,y,z;scanf("%d%d",&n,&m);for(int i=1;i<=m;++i){scanf("%d%d%d",&us[i],&vs[i],&ws[i]);AddEdge(vs[i],us[i],ws[i]);}int sccs=scc();for(int i=1;i<=m;++i){if(cmp[vs[i]]==cmp[us[i]] && ws[i]>0){puts("-1");return 0;}}for(int i=1;i<=n;++i){G[i].clear();}for(int i=1;i<=m;++i){if(cmp[vs[i]]!=cmp[us[i]]){++ru[cmp[us[i]]];G[cmp[vs[i]]].push_back((Edge){cmp[us[i]],ws[i]});}}queue<int>q;for(int i=1;i<=sccs;++i){if(!ru[i]){q.push(i);}}while(!q.empty()){int U=q.front(); q.pop();for(int i=0;i<G[U].size();++i){f[G[U][i].v]=max(f[G[U][i].v],f[U]+G[U][i].w);--ru[G[U][i].v];if(!ru[G[U][i].v]){q.push(G[U][i].v);}}}if(*max_element(f+1,f+sccs+1)>100){puts("-1");return 0;}for(int i=1;i<=n;++i){ansa[i]=f[cmp[i]];}for(int i=1;i<=n;++i){G[i].clear();rG[i].clear();}for(int i=1;i<=m;++i){AddEdge(us[i],vs[i],-ws[i]);}sccs=scc();for(int i=1;i<=m;++i){if(cmp[us[i]]==cmp[vs[i]] && ws[i]<0){puts("-1");return 0;}}for(int i=1;i<=n;++i){G[i].clear();}for(int i=1;i<=m;++i){if(cmp[us[i]]!=cmp[vs[i]]){++ru[cmp[vs[i]]];G[cmp[us[i]]].push_back((Edge){cmp[vs[i]],-ws[i]});}}memset(f,0x7f,sizeof(f));for(int i=1;i<=sccs;++i){if(!ru[i]){q.push(i);f[i]=100;}}while(!q.empty()){int U=q.front(); q.pop();for(int i=0;i<G[U].size();++i){f[G[U][i].v]=min(f[G[U][i].v],f[U]+G[U][i].w);--ru[G[U][i].v];if(!ru[G[U][i].v]){q.push(G[U][i].v);}}}if(*min_element(f+1,f+sccs+1)<0){puts("-1");return 0;}for(int i=1;i<=n;++i){printf("%d %d\n",ansa[i],f[cmp[i]]);}return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/6910370.html

【差分约束系统】【强连通分量缩点】【拓扑排序】【DAG最短路】CDOJ1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。...相关推荐

  1. bzoj2208 [Jsoi2010]连通数 强连通分量缩点+拓扑排序+bitset

    Description 对于100%的数据,N不超过2000. Solution 容易想到要tarjan缩点按拓扑序递推,但是去重的步骤不好弄 C++STL中有bitset,用这个当成二进制按位状压即 ...

  2. P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)

    文章目录 题目描述 解析 代码 洛谷传送门 题目描述 解析 看题目要求很容易想到强连通分量缩点加拓扑dp 但是问题在于存图 第一感就是和暴力和每个点连边 但那样无论点数和边数都很爆炸 随后我们发现这个 ...

  3. Jzoj P4253 QYQ在艾泽拉斯___强连通分量缩点+拓扑序dp

    题目大意: Q Y Q QYQ QYQ有 K K K次技能,每次可以从一个岛屿上闪现到另外一个岛屿上,每一个岛屿只能登上一次. Q Y Q QYQ QYQ能从任何一个城市开始旅程,也能在任何一个城市结 ...

  4. bzoj 2330 / AcWing 368 银河 差分约束系统+tarjan缩点+拓扑排序

    怎么最近bzoj一直上不了,莫非是挂了? AcWing的地址:https://www.acwing.com/problem/content/370/ 题意: 银河中的恒星浩如烟海,但是我们只关注那些最 ...

  5. POJ1236Network of Schools——强连通分量缩点建图

    [题目描述] A number of schools are connected to a computer network. Agreements have been developed among ...

  6. HDU 5934:Boom——强连通分量+缩点

    [题目描述] There are N bombs needing exploding.Each bomb has three attributes: exploding radius ri, posi ...

  7. The King’s Problem(tarjan求强连通分量缩点+匈牙利求有向无环图的最小路径覆盖)

    Link:http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King's Problem Time Limit: 2000/1000 MS (Jav ...

  8. POJ 2762Going from u to v or from v to u?(强联通 + 缩点 + 拓扑排序)

    [题意]: 有N个房间,M条有向边,问能否毫无顾虑的随机选两个点x, y,使从①x到达y,或者,②从y到达x,一定至少有一条成立.注意是或者,不是且. [思路]: 先考虑,x->y或者y-> ...

  9. tarjan算法总结 (强连通分量+缩点+割点),看这一篇就够了~

    文章目录 一.tarjan求强连通分量 1:算法流程 2:模板 二.tarjan缩点 1:相关定义 2:算法流程 三.tarjan求割点.桥 1.什么是割点 2.割点怎么求? 3.割点tarjan模板 ...

最新文章

  1. TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗
  2. 极速理解设计模式系列:9.工厂方法模式(Factory Method Pattern)
  3. simulink中选择开关模块的使用
  4. python调用shell命令之三慷慨法
  5. 安装 | MatlabR2021b链接及Matlabx运行图基本运行代码与图像
  6. 深度学习(五)——DRN, Bi-directional RNN, Attention, seq2seq, DMN
  7. led拼接屏报价_液晶拼接屏与led显示屏的区别在哪?
  8. Object Detection: Face Detection using Haar Cascades
  9. 整理了一个带语法高亮显示,及到处html功能的richtextbox控件
  10. 虚拟化学习笔记-虚拟机迁移的分类及原理
  11. 学习使用ADO.NET Data Services (ADO.NET 数据服务框架) - Part 1
  12. 大一高数下册笔记整理_高数下册学习笔记
  13. 学生信息管理系统—流程图
  14. 怎么设置服务器共享文件夹在哪里设置密码,共享文件夹怎么设置密码
  15. 【立创EDA开源推荐】10期基于PCB彩印教程(水转印)
  16. js执行机制经典面试题(一)
  17. css3常用语言-动画
  18. 欧格教育:提升店铺流量的方法
  19. HTC VIVE 禁用头盔定位与角度旋转
  20. verilog一二三段式状态机的标准区别和示例

热门文章

  1. mac 查看本地php 版本,Mac系统版本怎么看
  2. Metal 框架之自定义设置渲染通道
  3. 不同手机型号图文预览_关于iPhone的不同型号手机和不同版本系统
  4. Inspection info: Reports octal integer literals. Some coding standards prohibit the use of octal...
  5. 1044 Shopping in Mars(二分法)
  6. (9)机械臂路径规划
  7. vr性能测试软件,VR性能测试
  8. 2021年小目标检测最新研究综述 很全面值得收藏
  9. 解析Java框架中entity层,mapper层,service层,controller各层作用
  10. 万达商业再递招股书:上半年派息35亿 腾讯与碧桂园是股东