HDU 3592 World Exhibition(--差分约束--)
发布日期:2021-06-30 10:24:42
浏览次数:2
分类:技术文章
本文共 1657 字,大约阅读时间需要 5 分钟。
n n n个人排队
x x x个相互喜欢的关系,表示 d i s [ u ] − d i s [ v ] < = w dis[u]-dis[v]<=w dis[u]−dis[v]<=w
y y y个相互厌恶的关系,表示 d i s [ u ] − d i s [ v ] > = w dis[u]-dis[v]>=w dis[u]−dis[v]>=w
d i s [ u ] < = d i s [ v ] + w dis[u]<=dis[v]+w dis[u]<=dis[v]+w
那么 v v v向 u u u连一条权值 w w w的边
d i s [ v ] < = d i s [ u ] − w dis[v]<=dis[u]-w dis[v]<=dis[u]−w
那么 u u u向 v v v连一条边权 − w -w −w的边
而且需要满足 d i s [ i ] > = d i s [ i − 1 ] dis[i]>=dis[i-1] dis[i]>=dis[i−1]
那么 i i i向 i − 1 i-1 i−1连一条边权 0 0 0的边
然后跑最短路,即可
若最后 d i s [ n ] dis[n] dis[n]仍然是 i n f inf inf,说明没有限制条件,可以无限远
若有负环存在,会一直在环里减小,其实是无解的
#includeusing namespace std;const int inf = 1e9;const int maxn = 2e6+10;int t,n,q,qq;struct edge{ int to,nxt,w;}d[maxn]; int head[maxn],cnt=1;int dis[maxn],vis[maxn],shu[maxn];void add(int u,int v,int w){ d[++cnt] = (edge){ v,head[u],w},head[u] = cnt;}int spfa(int s){ for(int i=1;i<=n;i++) dis[i] = inf, vis[i] = shu[i] = 0; queue q; dis[s] = 0; q.push( s ); while( !q.empty() ) { int u = q.front(); q.pop(); vis[u] = 0; for(int i=head[u];i;i=d[i].nxt ) { int v = d[i].to; if( dis[v]>dis[u]+d[i].w ) { dis[v] = dis[u]+d[i].w; if( !vis[v] ) { vis[v] = 1, q.push( v ); if( ++shu[v]==n ) return -1; } } } } if( dis[n]==inf ) return -2; return dis[n];}int main(){ cin >> t; while( t-- ) { cin >> n >> q >> qq; for(int i=2;i<=n;i++) add(i,i-1,0); for(int i=1;i<=q;i++) { int l,r,w; scanf("%d%d%d",&l,&r,&w); add(l,r,w); } for(int i=1;i<=qq;i++) { int l,r,w; scanf("%d%d%d",&l,&r,&w); add(r,l,-w); } cout << spfa(1) << endl; cnt = 1; for(int i=1;i<=n;i++) head[i] = 0; }}
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/109985684 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月19日 21时37分27秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
如何在Linux使用Eclipse + CDT开发C/C++程序?
2019-04-30
Eclipse官网下载页面的Packages 和Developer Builds区别
2019-04-30
在CentOS 6.4安装Qt5.0.1
2019-04-30
深入浅出TCP之send和recv
2019-04-30
yum和apt-get的区别
2019-04-30
vim中文帮助的安装
2019-04-30
linux下获取所有文件夹和文件,支持nfs和xfs
2019-04-30
用分区魔术师把linux所占的分区删除后重写mbr
2019-04-30
软件架构师书籍
2019-04-30
Java程序员到架构师的推荐阅读书籍
2019-04-30
LFS、BLFS、ALFS、HLFS的区别
2019-04-30
国外知名网站评出对程序员最具影响力的图书(附下载)
2019-04-30
敏捷开发与极限编程
2019-04-30
如何获取system()函数的pid
2019-04-30
iconv 文件编码转换
2019-04-30
QLineEdit设置ip输入规则
2019-04-30
Linux串口编程
2019-04-30
交互设计专业书籍推荐(内有部分书籍电子版下载)
2019-04-30
strcasestr函数
2019-04-30
h264 ES流文件通过计算first_mb_in_slice区分帧边界
2019-04-30