CF 241E Flights
2016-07-11 16:46
211 查看
给定n(≤1000)个点m(≤5000)条边的有向无环图,要求给边赋权1或2,使1->n所有路径上的边权和相等,输出方案或无解。
PS:看到WJMZBMR全程for,改变了自己对差分约束系统的印象。
差分约束系统
PS:看到WJMZBMR全程for,改变了自己对差分约束系统的印象。
差分约束系统
#include<cstdio> #include<cstring> using namespace std; const int maxn=1005; const int maxe=5005; int n,m; int lx[maxn],rx[maxn],d[maxn]; int u[maxe],v[maxe]; int main(){ scanf("%d%d",&n,&m); for(int i=0;i<m;i++){ scanf("%d%d",&u[i],&v[i]); --u[i];--v[i]; } lx[0]=true;rx[n-1]=true; for(int i=0;i<n;i++){ bool update=false; for(int j=0;j<m;j++){ int u=::u[j],v=::v[j]; if(lx[u]&&!lx[v]){ lx[v]=true; update=true; } if(!rx[u]&&rx[v]){ rx[u]=true; update=true; } } if(!update)break; } bool ok=false; for(int i=0;i<n;i++){ bool update=false; for(int j=0;j<m;j++){ int u=::u[j],v=::v[j]; if(!lx[u]||!rx[v])continue; if(d[u]+1>d[v]){ d[u]=d[v]-1; update=true; } if(d[u]+2<d[v]){ d[v]=d[u]+2; update=true; } } if(!update){ ok=true; break; } } if(ok){ puts("Yes"); for(int i=0;i<m;i++){ int u=::u[i],v=::v[i]; if(d[v]-d[u]>2||d[v]-d[u]<1)printf("%d\n",1); else printf("%d\n",d[v]-d[u]); } } else puts("No"); return 0; }
相关文章推荐
- Cocos2dx报OpenGL error 0x0506错误
- iOS -- MVC的理解
- 网页版 treeview使用中遇到的问题
- WPF自动隐藏的消息框(鼠标放上去将一直显示,移开动画继续),提供normal和error两种边框。
- flask test_client设置cookies
- (4.2.33.1)Android上玩玩Hook(2):Cydia Substrate演练
- 关于UILabel
- levelDB源码学习——Arena(简单内存池)
- c 快速排序
- java调用R语言实现神经网络
- redis的pipeline测试分析
- 反省与规划
- IE支持rgba半透明的方法
- jquery.chosen.js实现模糊搜索
- 服务器缓存帮助类
- java TCP socket编程1
- Android进阶之WebView使用与兼容4.+滑动到顶部
- python脚本――一种连接mysql数据库的方法(取回数据为list非tuple格式)并将数据写入TXT
- AMD规范
- Ubuntu 把Tomcat8 设置成系统服务