思路:把每个点拆成(d+1)*n列,行数为可拆分区间数。对所有的有i号点拆分出来的行都要建一条该行到i列的边,那么就能确保有i号点拆出来的行只能选择一行。

#include<set>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define Maxn 1010
#define Maxm 80002
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 100000
#define lowbit(x) (x&(-x))
#define clr(x,y) memset(x,y,sizeof(x))
#define Mod 1000000007
using namespace std;
int U[Maxn*],D[Maxn*],L[Maxn*],R[Maxn*],S[Maxn*],H[Maxn],C[Maxn*],road[Maxn],id,d,n,m;
int g[][],row[Maxn*];
int vi[Maxn];
struct interv{
int s,e,i;
int operator <(const interv &temp) const{
if(s==temp.s)
return e>temp.e;
return s<temp.s;
}
}p[Maxn],ans[Maxn];
void init(int n)
{
int i;
for(i=;i<=n;i++){
D[i]=U[i]=i;
L[i+]=i;
R[i]=i+;
S[i]=;
}
R[n]=;
id=n+;
memset(H,-,sizeof(H));
}
void ins(int r,int c)
{
int i,j;
D[id]=D[c];
U[id]=c;
U[D[c]]=id;
D[c]=id;
if(H[r]<)
H[r]=L[id]=R[id]=id;
else{
L[id]=H[r];
R[id]=R[H[r]];
L[R[H[r]]]=id;
R[H[r]]=id;
}
S[c]++;
row[id]=r;
C[id++]=c;
}
void Remove(int c)
{
int i,j;
L[R[c]]=L[c];
R[L[c]]=R[c];
for(i=D[c];i!=c;i=D[i]){
for(j=R[i];j!=i;j=R[j]){
D[U[j]]=D[j];
U[D[j]]=U[j];
S[C[j]]--;
}
}
}
void Resume(int c)
{
int i,j;
L[R[c]]=c;
R[L[c]]=c;
for(i=D[c];i!=c;i=D[i]){
for(j=R[i];j!=i;j=R[j]){
D[U[j]]=j;
U[D[j]]=j;
S[C[j]]++;
}
}
}
bool dfs(int step)
{
int i,j,k,c,temp;
if(R[]==){
for(i=;i<step;i++)
vi[ans[road[i]].i]=road[i];
for(i=;i<=n;i++){
if(!vi[i]) printf("0 0\n");
else printf("%d %d\n",ans[vi[i]].s,ans[vi[i]].e);
}
return true;
}
temp=inf;
for(i=R[];i;i=R[i]) if(S[i]<temp){
temp=S[i];
c=i;
}
Remove(c);
for(i=D[c];i!=c;i=D[i]){
road[step]=row[i];
for(j=R[i];j!=i;j=R[j]){
Remove(C[j]);
}
if(dfs(step+))
return true;
for(j=L[i];j!=i;j=L[j])
Resume(C[j]);
}
Resume(c);
return false;
}
void build()
{
int i,j,sz,k,r;
init(n*(d+));
int cnt=;
for(i=;i<=n;i++){
for(j=p[i].s;j<=p[i].e;j++){
for(k=p[i].s;k<=j;k++){
ins(cnt,i);
ans[cnt].s=k,ans[cnt].e=j,ans[cnt].i=i;
for(r=;r<=n;r++){
if(!g[i][r]) continue;
for(int d=k;d<=j;d++){
ins(cnt,n+(d-)*n+r);
}
}
cnt++;
}
}
ins(cnt,i);
ans[cnt].s=,ans[cnt].e=,ans[cnt].i=i;
cnt++;
}
}
int main()
{
int i,j,u,v;
while(scanf("%d%d%d",&n,&m,&d)!=EOF){
memset(g,,sizeof(g));
for(i=;i<=m;i++){
scanf("%d%d",&u,&v);
g[u][v]=g[v][u]=;
}
for(i=;i<=n;i++){
g[i][i]=;
scanf("%d%d",&p[i].s,&p[i].e);
p[i].i=i;
}
build();
if(!dfs())
printf("No solution\n");
printf("\n");
}
return ;
}

hdu 3663 DLX的更多相关文章

  1. 搜索(DLX):HDU 3663 Power Stations

    Power Stations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. [DLX精确覆盖] hdu 3663 Power Stations

    题意: 给你n.m.d,代表有n个城市.m条城市之间的关系,每一个城市要在日后d天内都有电. 对于每一个城市,都有一个发电站,每一个发电站能够在[a,b]的每一个连续子区间内发电. x城市发电了.他相 ...

  3. 【HDU 3663】 Power Stations

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3663 [算法] 先建图,然后用Dancing Links求解精确覆盖,即可 [代码] #inclu ...

  4. HDU 3909 DLX

    http://blog.csdn.net/sr_19930829/article/details/39756513 http://www.kuangbin.net/archives/hdu4069-d ...

  5. hdu 3111 DLX解数独

    思路:裸的DLX解数独.关键是建图,感觉还不如写个dfs直接,DLX写这个的代码很烦. #include<set> #include<map> #include<cmat ...

  6. hdu 2295 DLX

    思路:裸的DLX重复覆盖 #include<set> #include<cmath> #include<queue> #include<cstdio> ...

  7. hdu 3656 DLX

    思路:二分枚举建边,用DLX判断是否满足. #include<set> #include<cmath> #include<queue> #include<cs ...

  8. HDU 2828 DLX搜索

    Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. (中等) HDU 3335 , DLX+重复覆盖。

    Description As we know,the fzu AekdyCoin is famous of math,especially in the field of number theory. ...

随机推荐

  1. 【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布 ...

  2. 更改VisualStudio默认创建类和接口不加public问题

    由于VisualStudio创建类和接口时,默认的是不加public关键字的,而我们大多数时候创建的类都是public的,于是,为了更好工作觉得改之. 首先找到在VisualStudio安装目录下路径 ...

  3. iPhone中国移动收不到彩信,联通不用设置都可以,具体设置方法:

    打开“设置”. 打开“通用”. 打开“蜂窝移动网络”. 打开“蜂窝数据移动网络”. 在“蜂窝移动数据”一栏中的“APN”处填入“cmnet”. 在“彩信”一栏中的“APN”处填入“cmnet”,“MM ...

  4. iOS开发-基本的网络知识

    一.HTTP协议的主要特点:(摘自 仰望星空 的博客)重点内容 1. CS模式 2. 简单快速:只需要传送请求方法和路径.(常用方法有GET,HEAD,POST) 3. 灵活:任意对象都可以,类型由C ...

  5. GIT 中提示 please tell me who you are

    如果使用git过程中出现了,please tell me who you are ,需要设置一下使用者的身份. 1.git config user.name "username" ...

  6. Android studio启动后无法更新

    I'm trying to run android-studio 1.0 on ubuntu using start up script but as i'm behind proxy the and ...

  7. PostgreSQL的注释嵌套的例子

    pgsql=# -- Multiline comments pgsql=# SELECT 'Multi' /* This comment extends across pgsql*# * number ...

  8. iOS10适配知识点

    http://ios.jobbole.com/89551/ http://ios.jobbole.com/88982/ 2.隐私数据访问问题 问题出现 现在app能运行了,当我打开相机时突然又cras ...

  9. 【转】struct和typedef struct

    原文:http://www.cnblogs.com/qyaizs/articles/2039101.html 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用type ...

  10. Android经常使用自己定义控件

    http://www.see-source.com/androidwidget/list.html