【洛谷P3275】糖果
题目大意:维护 M 个差分约束关系,问是否可以满足所有约束,如果满足输出一组解。\(N<=1e5\)
题解:差分约束模型可以通过构建一张有向图来求解。是否满足所有约束可以利用 spfa 进行判断,但是这道题数据范围是 1e5,spfa 很可能会被卡。重新考虑无解的情况,若满足最短路约束,则图中存在负环无解,最长路约束的情况则是存在正环无解。可以利用这一性质,对整个有向图进行 scc 缩点,若一个强连通分量中的边权和大于 0,则无解。缩点之后,在 DAG 上执行 dp 即可求得一组符合条件的解。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
struct node{
int nxt,to,w;
}e[maxn<<1];
int tot=1,head[maxn];
inline void add_edge(int from,int to,int w){
e[++tot]=node{head[from],to,w},head[from]=tot;
}
int n,m;
int dfs_clk,dfn[maxn],low[maxn],stk[maxn],top,in[maxn];
vector<pair<int,int>> G[maxn];
int scc,cor[maxn],size[maxn],indeg[maxn],dp[maxn];
queue<int> q;
void read_and_parse(){
n=read(),m=read();
for(int i=1,opt,x,y;i<=m;i++){
opt=read(),x=read(),y=read();
if(opt==1)add_edge(x,y,0),add_edge(y,x,0);
else if(opt==2)add_edge(x,y,1);
else if(opt==3)add_edge(y,x,0);
else if(opt==4)add_edge(y,x,1);
else if(opt==5)add_edge(x,y,0);
}
for(int i=1;i<=n;i++)add_edge(0,i,1);
}
void tarjan(int u){
dfn[u]=low[u]=++dfs_clk;
stk[++top]=u,in[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
else if(in[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
++scc;int v;
do{
v=stk[top--],in[v]=0;
cor[v]=scc,++size[scc];
}while(v!=u);
}
}
void topo(){
for(int i=1;i<=scc;i++)if(!indeg[i])q.push(i);
while(q.size()){
int u=q.front();q.pop();
for(int i=0;i<G[u].size();i++){
int v=G[u][i].first,w=G[u][i].second;
dp[v]=max(dp[v],dp[u]+w);
if(!--indeg[v])q.push(v);
}
}
}
void solve(){
tarjan(0);
for(int u=0;u<=n;u++)
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(cor[v]==cor[u]){
if(w)return (void)puts("-1");
continue;
}
else G[cor[u]].push_back(make_pair(cor[v],w)),++indeg[cor[v]];
}
topo();
ll ans=0;
for(int i=1;i<=scc;i++)ans=ans+(ll)size[i]*dp[i];
printf("%lld\n",ans);
}
int main(){
read_and_parse();
solve();
return 0;
}
【洛谷P3275】糖果的更多相关文章
- 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)
洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...
- 洛谷P3275 [SCOI2011]糖果 [差分约束系统]
题目传送门 糖果 题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比 ...
- 洛谷——P3275 [SCOI2011]糖果
P3275 [SCOI2011]糖果 差分约束模板题,基本思路就是$d[v]+w[v,u]<=d[u]$,$Spfa$更新方法, 有点套路的是要建立原点,即图中不存在的点来向每个点加边,但同样这 ...
- 【POJ 3159】Candies&&洛谷P3275 [SCOI2011]糖果
来补一下自己很久以前那个很蒟蒻很蒟蒻的自己没有学懂的知识 差分约束,说白了就是利用我们在求最短路的一个\(relax\)操作时的判断的原理 \[dis[v]>dis[u]+disj(u,v)\] ...
- 题解——洛谷P3275 [SCOI2011]糖果
一道条件非常多的差分约束 把\( a < b \)转化为\( a-b \le -1\)就可做了 \( a>b \)的情况同理 若有负环则无解输出-1 注意本题中要求每个人都有糖果 所以假设 ...
- 洛谷 P3275 BZOJ 2330 [SCOI2011]糖果
题目描述 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配 ...
- 洛谷P3275 [SCOI2011]糖果 题解
题目链接: https://www.luogu.org/problemnew/show/P3275 分析: 本题就是一个裸的差分约束. 核心: x=1x=1x=1时,a=b,a−>b,b−> ...
- 洛谷P3275 [SCOI2011]糖果(差分约束)
题目描述 幼儿园里有 $N$ 个小朋友,$lxhgww $老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...
- 洛谷P3275 [SCOI2011]糖果
差分约束大坑题 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring ...
随机推荐
- Android——MaterialDesign之四 FloatingActionButton、Snackbar、CoordinaterLayout
FloatingActionButton 悬浮按钮,默认colorAccent来作为按钮的颜色 <android.support.design.widget.FloatingActionButt ...
- python数学第九天【统计】
- sqlserver数据库性能测试方法
测试计划-添加jdbc jar 地址(数据驱动) jdbc configuration 地址 jdbc:sqlserver://127.0.0.1:1433;databasename=XSData j ...
- 初识Xml。
/* * 一.Xml? * * 1.是什么? * Extensible markup Language 可拓展标记性语言 * 功能是 储存数据 * 1.配置文件 * 2.在网络中传输数据 * xml和 ...
- 三、zookeeper安装
一.简介 二.下载解压: #wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar ...
- cookie的域,路径
Cookie 的路径以及 Cookie 域 cookie 路径 cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个cookie.在默认情况下,出 ...
- BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心
题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...
- Biorhythms POJ - 1006 中国剩余定理
定理证明:https://blog.csdn.net/d_x_d/article/details/48466957 https://blog.csdn.net/lyy289065406/article ...
- Scrapy爬取伯乐在线文章
首先搭建虚拟环境,创建工程 scrapy startproject ArticleSpider cd ArticleSpider scrapy genspider jobbole blog.jobbo ...
- Apache 开启压缩传输
在 /etc/httpd/conf/httpd.conf 中添加如下配置: # Enable gzip - by Jerryhuang # <IfModule mod_deflate.c> ...