[BZOJ2330][SCOI2011]糖果
2015-07-30 20:09
337 查看
原题地址
差分约束系统.
AC code:
差分约束系统.
AC code:
#include <cstdio> #include <queue> using namespace std; typedef long long ll; const int N=1000010; const int INF=1<<28; ll ans; int n,k,S,cnt; int head ,maxw ,tim ; bool inq ; struct Edge{ int v,w,next; Edge() {} Edge(int v,int w,int next):v(v),w(w),next(next) {} }E ; void addedge(int u,int v,int w){ E[++cnt]=Edge(v,w,head[u]); head[u]=cnt; } void SPFA(){ queue<int> Q; maxw[S]=1; for(int i=1;i<=n;i++) maxw[i]=-INF; Q.push(S);inq[S]=1; while(!Q.empty()){ int x=Q.front(); Q.pop();inq[x]=0; for(int i=head[x];i;i=E[i].next){ Edge e=E[i]; if(maxw[x]+e.w<=maxw[e.v]) continue; if(++tim[e.v]>n){ printf("-1\n"); return ; } maxw[e.v]=maxw[x]+e.w; if(!inq[e.v]){inq[e.v]=1;Q.push(e.v);} } } for(int i=1;i<=n;i++) ans+=maxw[i]; printf("%lld\n",ans); } int main(){ scanf("%d%d",&n,&k); S=n+1; for(int i=n;i>=1;i--) addedge(S,i,0); for(int i=1;i<=k;i++){ int x,a,b; scanf("%d%d%d",&x,&a,&b); if(x==1){addedge(a,b,0);addedge(b,a,0);} else if(x==2) addedge(a,b,1); else if(x==3) addedge(b,a,0); else if(x==4) addedge(b,a,1); else addedge(a,b,0); } SPFA(); return 0; }
相关文章推荐
- C++ 运算符 优先级
- hdu 5327 Olympiad(前缀和)
- hdu 2141 Can you find it?
- python下编译py成pyc和pyo
- 云计算和大数据时代网络技术揭秘(十九)万兆革命 (完)
- iOS UIViewController API解读
- 瓶颈确认之IO瓶颈确认之第一篇
- 使用GEOTools读取dbf文件
- KEIL C51 和 ANSI C 的区别
- hdu 1874 畅通工程续
- uva 10308 Roads in the North 北方的道路
- JavaScript跨域总结与解决办法
- ios UIView全部API解读
- 【置顶随笔】
- 归并排序(转载http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html)
- Msql点滴学习之存储引擎
- LDD:Ch 1 设备驱动程序简介
- 关于时序图的上升沿下降沿读取数据的问题
- OC中数组、字典的遍历的三种方法
- UVA 12594 Naming Babies (斜率优化DP)