2330: [SCOI2011]糖果
2015-12-10 11:54
381 查看
差分约束系统。
特殊数据害人不浅。。。。。。。。
Spfa可能TLE,最好用Dijkstra。
特殊数据害人不浅。。。。。。。。
Spfa可能TLE,最好用Dijkstra。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct Edge{int to,next,v;}e[400005]; int head[100005],d[100005],cnt[100005],edge,n,k; bool inq[100005]; void ins(int u,int v,int w){ edge++; e[edge].to=v;e[edge].next=head[u];e[edge].v=w;head[u]=edge; } bool spfa(int s){ queue<int>q;q.push(s);inq[s]=true; cnt[s]=1; while(!q.empty()){ int u=q.front();q.pop(); inq[u]=false; for(int i=head[u];i;i=e[i].next) if(d[e[i].to]<d[u]+e[i].v){ d[e[i].to]=d[u]+e[i].v; if(++cnt[e[i].to]>=n)return true; if(!inq[e[i].to]){ inq[e[i].to]=true;q.push(e[i].to); } } } return false; } bool init(){ scanf("%d%d",&n,&k);int x,a,b; for(int i=1;i<=k;i++){ scanf("%d%d%d",&x,&a,&b); switch(x){ case 1:ins(a,b,0);ins(b,a,0);break; case 2:if(a==b)return false;ins(a,b,1);break; case 3:ins(b,a,0);break; case 4:if(a==b)return false;ins(b,a,1);break; case 5:ins(a,b,0);break; } } return true; } int main(){ if(!init()){ printf("-1"); return 0; } int S=n+1; for(int i=n;i>=1;i--) ins(S,i,1); if(spfa(S)){ printf("-1"); return 0; } long long ans=0; for(int i=1;i<=n;i++) ans+=d[i]; printf("%lld",ans); return 0; }
相关文章推荐
- unset
- Touch事件分发机制
- Android Studio 编译报错:Process 'command 'D:\SDK\AS\sdk\build-tools\23.0.0\aapt.exe'' finished with non-zero exit value 1
- cell展开的几种方式
- overridePendingTransition动画只设置一个
- JS获取select属性值
- 老李分享:钩子
- 详细解析oracle中left join,right join,inner join用法
- 《C接口与实现》第 2 章 接口与实现
- #pragma 预处理指令详解
- 定义和实现二叉树
- css3中比较少用到的属性记录
- expect
- 安装Module-Build-0.36_11报错:license_creation..disabled requires:!Software::License is not
- list的拼接与去重
- xib的autolayout和autoresizing
- 空间配置器(STL源码剖析)
- 获得控件的高度
- Android 更改 Toast 的默认位置
- AngularJS 配置和运行phonecat错误