#Tarjan,SPFA,差分约束系统#BZOJ 2330 AcWing 368 银河
分析
首先这明显是一道差分约束题,但是无解的情况确实比较恶心,
考虑它的边权为0或1,无解当且仅当某个强连通分量内的边至少一条边边权为1,
那么用有向图的Tarjan缩点后跑SPFA就可以了
代码
#include <cstdio>
#include <cctype>
#include <stack>
#include <cstring>
#include <queue>
#define rr register
using namespace std;
const int N=100011; stack<int>stac; queue<int>q;
struct node{int y,w,next;}e[N*3],E[N*3];
int dfn[N],low[N],v[N],dis[N],hs[N],col[N];
int siz[N],as[N],cnt,tot,et,Et,n,m; long long ans;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void add(int x,int y,int w){E[++Et]=(node){y,w,hs[x]},hs[x]=Et;}
inline signed min(int a,int b){return a<b?a:b;}
inline void tarjan(int x){
dfn[x]=low[x]=++tot,
stac.push(x),v[x]=1;
for (rr int i=hs[x];i;i=E[i].next)
if (!dfn[E[i].y]){
tarjan(E[i].y);
low[x]=min(low[x],low[E[i].y]);
}else if (v[E[i].y])
low[x]=min(low[x],dfn[E[i].y]);
if (dfn[x]==low[x]){
rr int y; ++cnt;
do{
y=stac.top(); stac.pop();
col[y]=cnt,v[y]=0,++siz[cnt];
}while (x^y);
}
}
signed main(){
n=iut()+1; m=iut();
for (rr int i=1;i<n;++i) add(n,i,1);
for (rr int i=1;i<=m;++i){
rr int z=iut(),x=iut(),y=iut();
switch (z){
case 1:{
add(x,y,0),add(y,x,0);
break;
}
case 2:{
add(x,y,1);
break;
}
case 3:{
add(y,x,0);
break;
}
case 4:{
add(y,x,1);
break;
}
case 5:{
add(x,y,0);
break;
}
}
}
for (rr int i=1;i<=n;++i)
if (!dfn[i]) tarjan(i);
for (rr int i=1;i<=n;++i)
for (rr int j=hs[i];j;j=E[j].next)
if (col[i]^col[E[j].y])
e[++et]=(node){col[E[j].y],E[j].w,as[col[i]]},as[col[i]]=et;
else if (E[j].w) return !printf("-1");
memset(dis,0xcf,sizeof(dis));
q.push(col[n]),v[col[n]]=1,dis[col[n]]=0;
while (!q.empty()){
rr int x=q.front(); q.pop();
for (rr int i=as[x];i;i=e[i].next)
if (dis[e[i].y]<dis[x]+e[i].w){
dis[e[i].y]=dis[x]+e[i].w;
if (!v[e[i].y]) v[e[i].y]=1,q.push(e[i].y);
}
v[x]=0;
}
for (rr int i=1;i<=cnt;++i) ans+=siz[i]*dis[i];
return !printf("%lld",ans);
}
#Tarjan,SPFA,差分约束系统#BZOJ 2330 AcWing 368 银河的更多相关文章
- spfa+差分约束系统(C - House Man HDU - 3440 )+对差分约束系统的初步理解
题目链接:https://cn.vjudge.net/contest/276233#problem/C 题目大意:有n层楼,给你每个楼的高度,和这个人单次的最大跳跃距离m,两个楼之间的距离最小是1,但 ...
- spfa+差分约束系统(D - POJ - 1201 && E - POJ - 1364&&G - POJ - 1)+建边的注意事项+超级源点的建立
题目链接:https://cn.vjudge.net/contest/276233#problem/D 具体大意: 给出n个闭合的整数区间[ai,bi]和n个整数c1,-,cn. 编写一个程序: 从标 ...
- BZOJ 2330 [SCOI2011]糖果 ——差分约束系统 SPFA
最小值求最长路. 最大值求最短路. 发现每个约束条件可以转化为一条边,表示一个点到另外一个点至少要加上一个定值. 限定了每一个值得取值下界,然后最长路求出答案即可. 差分约束系统,感觉上更像是两个变量 ...
- BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5395 Solved: 1750[Submit][Status ...
- bzoj 2330 [SCOI2011]糖果(差分约束系统)
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3574 Solved: 1077[Submit][Status ...
- BZOJ 2330 糖果 差分约束求最小值
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2330 题目大意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果 ...
- 差分约束系统 + spfa(A - Layout POJ - 3169)
题目链接:https://cn.vjudge.net/contest/276233#problem/A 差分约束系统,假设当前有三个不等式 x- y <=t1 y-z<=t2 x-z< ...
- 【差分约束系统/SPFA】POJ3169-Layout
[题目大意] n头牛从小到大排,它们之间某些距离不能大于一个值,某些距离不能小于一个值,求第一头牛和第N头牛之间距离的最大值. [思路] 由题意可以得到以下不等式d[AL]+DL≥d[BL]:d[BD ...
- 【差分约束系统】【spfa】UVALive - 4885 - Task
差分约束系统讲解看这里:http://blog.csdn.net/xuezhongfenfei/article/details/8685313 模板题,不多说.要注意的一点是!!!对于带有within ...
- 【bzoj3436】小K的农场 差分约束系统+最长路-Spfa
原文地址:http://www.cnblogs.com/GXZlegend/p/6801470.html 题目描述 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总 ...
随机推荐
- Jenkins流水线使用@Grab 导入Maven库
有个需求需要在pipeline中调用Java的SDK去执行业务 使用 @Grab 注解可以在Maven中导入Java 库, @Grab('org.apache.commons:commons-math ...
- docker自定义bridge网络
>>> docker network create -d bridge bridge-net # 创建一个名为bridge-net的网络 # 测试,启动两个容器,并且接入到bridg ...
- jdk17新特性梳理
jdk17新特性梳理 目录 jdk17新特性梳理 jdk8升级至jdk17新特性梳理 升级jdk17的理由 新特性梳理 可以在接口中定义私有方法,主要为了jdk8的default方法 局部变量可以使用 ...
- 苹果工程师对iOS线程开发的那点事津津乐道
pthread,Thread总结 pthread: 通用的多线程API 使用方法 // 1. 创建线程: 定义一个pthread_t类型变量 pthread_t thread; // 2. 开启线程: ...
- 【Azure Redis 缓存】Azure Cache for Redis有默认备份可以用于恢复么?
问题描述 Azure Cache for Redis有默认备份可以用于恢复么? 答: 只有高级版Redis有. 问题原因 Azure Cache for Redis有不同的版本定价层(基本 Basic ...
- Jmeter 之常数吞吐量作用
一 添加方法: 线程组右键->添加->定时器-> 常数吞吐量定时器 二 作用: 常数吞吐量定时器的作用: 设置最大的吞吐量不超过设置的值 注意:如果线程能发送的请求远远低于设置的 ...
- C++ //set/multiset 容器 //set不可以插入重复的数字 multiset可以插入重复的数字 //ste容器构造和赋值 //set大小和交换 //set 插入和删除 //set查找和统计 //set 和 multiset 区别 //pair 对组创建 //set存放自定义数据类型 //set内置数据 进行排序
1 //set/multiset 容器 //set不可以插入重复的数字 multiset可以插入重复的数字 2 //ste容器构造和赋值 //set大小和交换 //set 插入和删除 3 //set查 ...
- Sliver C2通关渗透攻击红队内网域靶场2.0
准备 2012 server 第一台机器开机后,要在C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain手动运行下 s ...
- 【EasyExcel详细步骤】(内附源码)
页面预览 数据导出 数据导入 第01章-Alibaba EasyExcel 1.EasyExcel介绍 1.1.EasyExcel的作用 数据导入:减轻录入工作量 数据导出:统计信息归档 数据传输:异 ...
- 实现一个 SEO 友好的响应式多语言官网 (Vite-SSG + Vuetify3) 我的踩坑之旅
在 2023 年的年底,我终于有时间下定决心把我的 UtilMeta 项目官网 进行翻新,主要的原因是之前的官网是用 Vue2 实现的一个 SPA 应用,对搜索引擎 SEO 很不友好,这对于介绍项目的 ...