题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3663
题意:给你一个最多60个点150个边的无向图,每个点是一个村庄,每个村庄都有一个发电站,每个电站可以给它所在的村庄和它有边直接连接的所有村庄供电,现在让你选出一些电站,使每个村庄都能被供电且每个村庄只被一个电站供电。
另外,每个村庄的发电站都只能在1-d天内的一个子区间工作,你需要安排它在哪几天来工作,且每个电站一旦工作结束就不能再次启动,即它工作的时间是连续的。d小于等于5。
每个顶点在每一天只能被覆盖一次,精确覆盖问题,为每一个村庄的每一种选择建立一列,每一村庄的每一天建立一行,另由于每一个村庄的每一种选择只能一次,建立n列进行限制,即是 n*d+n 列的精确覆盖问题。
啥都不说了,数据中肯定有重复边,RE死了……
Code:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define M 1024 #define N 512 const int V=M*N; const int head=0; int U[V],D[V],L[V],R[V],O[V],C[V]; int S[M],H[M],Row[V]; int mapc[M],mapf[M],mapt[M]; int af[M],at[M]; int size,ak; typedef struct{ int v,nxt; }Edge; Edge edg[M]; int G[M]; int e,n,m,d; void AddEdge(int u,int v) { edg[e].v=v;edg[e].nxt=G[u];G[u]=e++; } 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]){ U[D[j]]=U[j]; D[U[j]]=D[j]; S[C[j]]--; } } } void Resume(int c) { int i,j; for(i=U[c];i!=c;i=U[i]){ for(j=L[i];j!=i;j=L[j]){ U[D[j]]=D[U[j]]=j; S[C[j]]++; } }R[L[c]]=L[R[c]]=c; } int Dance(int k) { int min,i,j,c; if(R[head]==head){ ak=k;return 1; } for(min=V,c=0,i=R[head];i!=head;i=R[i]){ if(S[i]<min) min=S[i],c=i; } Remove(c); for(i=D[c];i!=c;i=D[i]){ for(j=R[i];j!=i;j=R[j]) Remove(C[j]); O[k]=Row[i]; if(Dance(k+1)) return 1; for(j=L[i];j!=i;j=L[j]) Resume(C[j]); } Resume(c); return 0; } void Link(int f,int &h,int x) { S[x]++; C[size]=x; Row[size]=f; U[size]=U[x]; D[U[x]]=size; D[size]=x; U[x]=size; if(h==-1) L[size]=R[size]=h=size; else{ L[size]=L[h]; R[L[h]]=size; R[size]=h; L[h]=size; } size++; } int main() { int i,j,k; int u,v; int r,c; int f,t; int tmp; while(~scanf("%d%d%d",&n,&m,&d)){ e=0; memset(G,-1,sizeof(G)); for(i=1;i<=n;i++) AddEdge(i,i); for(i=0;i<m;i++){ scanf("%d%d",&u,&v); AddEdge(u,v); AddEdge(v,u); } c=n*d+n; for(i=0;i<=c;i++){ S[i]=0;D[i]=U[i]=i; L[i+1]=i;R[i]=i+1; }R[c]=0; size=c+1;r=0; memset(H,-1,sizeof(H)); bool mark[M]; memset(mark,true,sizeof(mark)); for(u=1;u<=n;u++){ scanf("%d%d",&f,&t); Link(r,H[r],n*d+u); mapc[r]=u;mapf[r]=0;mapt[r++]=0; memset(mark,true,sizeof(mark)); for(i=f;i<=t;i++){ for(j=i;j<=t;j++){ Link(r,H[r],n*d+u); for(k=i;k<=j;k++){ for(tmp=G[u];tmp!=-1;tmp=edg[tmp].nxt){ if(mark[k+d*(edg[tmp].v-1)]){ Link(r,H[r],k+d*(edg[tmp].v-1)); mark[k+d*(edg[tmp].v-1)]=false; } } } mapc[r]=u;mapf[r]=i;mapt[r++]=j; memset(mark,true,sizeof(mark)); } } } if(Dance(0)){ for(i=0;i<ak;i++) af[mapc[O[i]]]=mapf[O[i]],at[mapc[O[i]]]=mapt[O[i]]; for(i=1;i<=n;i++) printf("%d %d\n",af[i],at[i]); } else puts("No solution"); puts(""); } return 0; }