懒得复制题面,戳我戳我


Question:

(因为网上找不到好的翻译,这里简单复述一下)

告诉你\(m1+m2\)个约束条件,然后要你找出\(X_1-X_n\)这些数字,求满足要求的数列中不同的数字个数最多有多少个(exp:\(1,2,3,3,2\)里面就有三个不同的数)

Solution:

  • 首先的差分约束的连边很简单
for(int i=1;i<=m1;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y,1);add(y,x,-1);be[x]=be[y]=true;
}
for(int i=1;i<=m2;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y,0);be[x]=be[y]=true;
}
  • 然后我们要知道的就是在不同的强联通分量里面的数是不会相互影响的,因为如果不再一个强联通分量中一定是连的\(0\)边,所以我们就只用把\(0\)边连向的那个强联通分量全部变大一些就可以了
  • 所以我们就可以缩点(只用求出每个点在哪个强联通分量中就可以了),如果存在某个强连通中存在正环,就一定是不能找到一组满足的数值,输出\(NIE\)就好。
  • 然后我们就在每个不同的强联通分量中求最长路,这个强联通中的最多不同数值就是最长路数值\(+1\),然后把每个强联通的贡献相加就好了
  • PS:在求每个强联通时最好每个点作为初始点进行\(SPFA\),求出这个点为初始点时的最长路,所以嘞我们应该是可以用\(Floyd\)来做的。

我觉得我的代码打的很繁琐,所以看不看也无所谓了,另外我这个代码可以优化的就是可以在最后面求值是判断正环存在,应该可以适当减低时间复杂度


Code:

//It is coded by Ning_Mew on 4.2
#include<bits/stdc++.h>
using namespace std; const int maxn=607;
const int maxm=1e5; int n,m1,m2,INF,ans=0;
bool be[maxn];
int dist[maxn],vis[maxn],TT[maxn],vs[maxn];
int head[maxn],cnt=0,dfn[maxn],low[maxn],ct=0;
int color[maxn],num_color=0,team[maxn],last=1;
bool instack[maxn];
struct Edge{
int nxt,to,dis;
}edge[maxm*2];
bool choose[maxn]; void add(int from,int to,int dis){
edge[++cnt].nxt=head[from];
edge[cnt].to=to;
edge[cnt].dis=dis;
head[from]=cnt;
} bool SPFA(int k,int ls,int num){
queue<int>Q;while(!Q.empty())Q.pop();
Q.push(k);vis[k]=ls;be[k]=false;dist[k]=0;
TT[k]=1;vs[k]=ls;
while(!Q.empty()){
int u=Q.front();Q.pop();vis[u]=ls-1;
for(int i=head[u];i!=0;i=edge[i].nxt){
int v=edge[i].to;be[v]=false; if(num==-1||color[v]==num);else continue; if(dist[v]<dist[u]+edge[i].dis){
dist[v]=dist[u]+edge[i].dis;
if(dist[v]>n)return false;
if(vis[v]!=ls){
vis[v]=ls;Q.push(v);
if(vs[v]!=ls){
vs[v]=ls; TT[v]=1;
}else{ TT[v]++; }
}
}
}
}return true;
}
void tarjan(int u){
dfn[u]=++ct;low[u]=ct;team[last]=u;last++;instack[u]=true;
for(int i=head[u];i!=0;i=edge[i].nxt){
int v=edge[i].to;
if(dfn[v]==0){tarjan(v); low[u]=min(low[u],low[v]);
}else{if(instack[v])low[u]=min(low[u],dfn[v]);}
}
int v=-100;
if(dfn[u]==low[u]){
num_color++;
do{v=team[--last];color[v]=num_color;instack[v]=false;
}while(v!=u);
}return;
}
int lls=1;
int find(int c){
int re=-0x5f,maxx=-0x5f,minn=0x5f;
for(int i=1;i<=n;i++){
if(color[i]!=c)continue;
//memset(vis,0,sizeof(vis));
memset(dist,-0x5f,sizeof(dist));
SPFA(i,++lls,color[i]);
maxx=-0x5f;minn=0x5f; //cout<<"-----"<<' '<<c<<endl;
//for(int j=1;j<=n;j++)
// cout<<j<<' '<<color[j]<<' '<<dist[j]<<endl; for(int j=1;j<=n;j++){
if(color[j]!=c)continue;
if(dist[j]==INF)continue;
maxx=max(maxx,dist[j]);
minn=min(minn,dist[j]);
}
re=max(re,maxx-minn);
//cout<<re<<endl;
}
//cout<<"ANS:"<<c<<' '<<re<<endl;
return re;
}
int main(){
scanf("%d%d%d",&n,&m1,&m2);
memset(be,false,sizeof(be));
for(int i=1;i<=m1;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y,1);add(y,x,-1);be[x]=be[y]=true;
}
for(int i=1;i<=m2;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y,0);be[x]=be[y]=true;
}
int ls=1;
memset(dist,-0x5f,sizeof(dist));
INF=dist[0];
for(int i=1;i<=n;i++){
if(be[i]){
if(SPFA(i,++ls,-1));else{printf("NIE\n");return 0;}
}
}
for(int i=1;i<=n;i++)if(dist[i]==INF)dist[i]=0;
//for(int i=1;i<=n;i++)cout<<"num:"<<i<<' '<<dist[i]<<endl;
//cout<<"SPFA finished"<<endl;
memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
for(int i=1;i<=n;i++){
if(dfn[i]==0)tarjan(i);
}
//for(int i=1;i<=n;i++)cout<<"num:"<<i<<' '<<color[i]<<endl;
memset(choose,false,sizeof(choose));
for(int i=1;i<=n;i++){
if(choose[ color[i] ]==true)continue;
choose[ color[i] ]=true;
int box=find(color[i]);ans+=(box+1);
//cout<<i<<' '<<color[i]<<' '<<box<<endl;
}
printf("%d\n",ans);
return 0;
}

【题解】 [POI2012]FES-Festival (差分约束)的更多相关文章

  1. [Poi2012]Festival 差分约束+tarjan

    差分约束建图,发现要在每个联通块里求最长路,600,直接O(n3) floyed #include<cstdio> #include<cstring> #include< ...

  2. bzoj 2788 [Poi2012]Festival 差分约束+tarjan+floyd

    题目大意 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1.给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb 2.给出c,d (1&l ...

  3. BZOJ 3436: 小K的农场 差分约束

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3436 题解: 裸的差分约束: 1.a>=b+c  ->  b<=a-c ...

  4. BZOJ-2330-[SCOI2011]糖果(差分约束)

    Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...

  5. 【最短路·差分约束】洛谷P1250

    题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E, ...

  6. 【BZOJ3436】小K的农场 差分约束

    [BZOJ3436]小K的农场 Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了, ...

  7. POJ3169:Layout(差分约束)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15705   Accepted: 7551 题目链接:http ...

  8. hdoj--1384--Intervals(差分约束)

    Intervals Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  9. POJ1201Intervals(差分约束)

    题意 给出数轴上的n个区间[ai,bi],每个区间都是连续的int区间. 现在要在数轴上任意取一堆元素,构成一个元素集合V 要求每个区间[ai,bi]和元素集合V的交集至少有ci不同的元素 求集合V最 ...

随机推荐

  1. 03-Centos7安装部署Mirrorgate-踩坑记录

    FAQ 1.没有安装bzip2 解决方法 yum -y install bzip2 > phantomjs-prebuilt@2.1.16 install /root/test/mirrorga ...

  2. Codeforces round 1111

    CF Div 2 537 比赛链接 感觉题目难度OK,五个题都能做,后俩题考察人的翻译水平... 另外,$Claris$太强了... A 直接按照题意模拟,不知道为啥有人会被× 代码: #includ ...

  3. Python算法基础

    一.简介 定义和特征 定义:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时 ...

  4. 20155202张旭 Exp7 网络欺诈技术防范

    20155202张旭 Exp7 网络欺诈技术防范 基础问题回答 通常在什么场景下容易受到DNS spoof攻击? 在同一局域网下比较容易受到DNS spoof攻击,攻击者可以冒充域名服务器,来发送伪造 ...

  5. 2017-2018-2 20155231《网络对抗技术》实验五: MSF基础应用

    2017-2018-2 20155231<网络对抗技术>实验五: MSF基础应用 实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 实验内容 (1)各种搜索技巧的应用 比如IP2L ...

  6. EZ 2018 03 23 NOIP2018 模拟赛(五)

    链接:http://211.140.156.254:2333/contest/65 这次Rating重回Rank18,我是20的守门员(滑稽) 这次题目和数据普遍偏水,我T2打错了一个变量名竟然过了所 ...

  7. vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍

    这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...

  8. CS190.1x-ML_lab3_linear_reg_student

    这次作业主要是有关监督学习,数据集是来自UCI Machine Learning Repository的Million Song Dataset.我们的目的是训练一个线性回归的模型来预测一首歌的发行年 ...

  9. [SHOI2012]随机树[期望dp]

    题意 初始 \(1\) 个节点,每次选定一个叶子节点并加入两个儿子直到叶子总数为 \(n\),问叶子节点深度和的平均值的期望以及最大叶子深度的期望. \(n\leq 100\) . 分析 对于第一问, ...

  10. 【Direct2D1.1初探】Direct2D特效概览

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D是一个基于Direct3D的2D图形API,可以利用硬件加速特性来提供高性能高质量的2D渲染.但 ...