懒得复制题面,戳我戳我


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. Usaco2012-2013 金组 题解 (暂缺Hill walk以及Figue eight)

    https://files.cnblogs.com/files/Winniechen/usaco2012-2013.pdf 做的不是很好,还请见谅! 如果有什么疑问,可以QQ上找我. QQ号:1967 ...

  2. MapReduce -- TF-IDF

    通过MapReduce实现 TF-IDF值的统计 数据:文章ID 文件内容 今天约了姐妹去逛街吃美食,周末玩得很开心啊! ...... ...... 结果数据: 开心:0.28558719539400 ...

  3. IHttpModule不起作用的两个原因

    最近在将系统改造成微服务的过程中,需要对以前的Url请求做兼容性处理,于是就采用了HttpModules模型,但在测试中碰到IHttpModules模块不起作用. 一.IIS配置问题 我用的IIS7. ...

  4. jvm系列(九):Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  5. stl源码剖析 详细学习笔记deque(3)

    protected: typedef simple_alloc<value_type,Alloc> data_allocator; //用来配置元素的alloc typedef simpl ...

  6. 创建并使用maven archetype的随笔

    maven骨架archetype的意义在于一些项目的基础项:如引入的maven组件,例如eureka,ribben等,不希望每次新建项目都重复做一遍,还有例如公司规范的log格式,单元测试工具等,在新 ...

  7. flask_admin 笔记二 授权和权限

    权限当然就是让有应该权限的用户能执行某些操作,把没有权限的用户限制在外面.Flask-admin提供了几种方法来处理: 1, Http basic Auth 最简单的身份验证形式是HTTP基本身份验证 ...

  8. mssql循环记录之while方法

    1.定义变量 Declare @i Int 2.获取单条记录 Select @i=Min([id]) From [数据库名] Where <检索条件> 3.While循环 While @i ...

  9. java BigDecimal实现精确加减乘除运算

    java.math.BigDecimal.BigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDecimal(double val)Translates a doubl ...

  10. PAT甲题题解-1122. Hamiltonian Cycle (25)-判断路径是否是哈密顿回路

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789799.html特别不喜欢那些随便转载别人的原创文章又不给 ...