一开始题意理解成颜色不懂不相连就要换笔,各种Wrong之后去百度就发现自己SB了,把建图改了一下就AC了。
ACcode:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int NS=15;
const int INF=1<<25;
struct Rectangle
{
int x1,y1,x2,y2,ty;
void inpt(int xa,int xb,int xc,int xd,int xe){
x1=xa,y1=xb,x2=xc,y2=xd,ty=xe;
}
}rec[NS];
int n,x,y,z,w,r,lim,res;
int pre[NS],g[NS][NS];
int dp[1<<NS][NS];
bool cmp(Rectangle xa,Rectangle xb)
{
return xa.y1<xb.y1;
}
int link(Rectangle xa,Rectangle xb)
{
return (xa.ty==xb.ty);
}
int ok(Rectangle xa,Rectangle xb)
{
return ((xa.y1>=xb.y2)&&(!(xa.x2<=xb.x1||xa.x1>=xb.x2)));
}
int Min(int xa,int xb)
{
return xa<xb?xa:xb;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
memset(g,0,sizeof(g));
memset(pre,0,sizeof(pre));
scanf("%d",&n);
lim=1<<n,res=INF;
for (int i=0;i<n;i++)
{
scanf("%d%d%d%d%d",&y,&x,&w,&z,&r);
rec[i].inpt(x,y,z,w,r);
}
sort(rec,rec+n,cmp);
for (int i=0;i<n;i++)
for (int j=0;j<i;j++)
{
g[j][i]=g[i][j]=link(rec[i],rec[j]);
if (ok(rec[i],rec[j])) pre[i]|=1<<j;
}
for (int i=0;i<lim;i++)
for (int j=0;j<n;j++)
dp[i][j]=INF;
for (int i=0;i<n;i++)
if (!pre[i]) dp[1<<i][i]=1;
for (int i=0;i<lim;i++)
for (int j=0;j<n;j++)
if (i&(1<<j))
{
y=i^(1<<j);
if ((y&pre[j])==pre[j])
for (int k=0;k<n;k++)
if (y&(1<<k))
dp[i][j]=Min(dp[i][j],dp[y][k]+(1^g[k][j]));
}
for (int i=0;i<n;i++)
res=Min(res,dp[lim-1][i]);
printf("%d\n",res);
}
return 0;
}