没过的点似乎大1
可能是建图的时候,矩阵的边界没处理好,重复了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<unordered_map>
using namespace std;
#define debug cout<<"!error!";
const int N = 1e5 + 10,M = 110,inf = 0x3f3f3f3f;
template <class T> void read(T &w){
w=0;unsigned long long f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){(w*=10)+=ch-'0';ch=getchar();}
w*=f;
}
template <class T> void write(T w){
if(w<0){putchar('-');w*=-1;}
if(w/10) write(w/10);
putchar(w%10+'0');
}
int top_cnt = 0;
int n;
int vis[N];
int st[N];
int pun[20][20];
int din[N];
int cnt_col;
int col_st[N];
//int g[M][M];
int fa[N];
int color_h[N];
int h[N], e[N], ne[N], idx = 1;
int f[N][20];
void add(int a,int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
//map<pair<int,int> , int> h[N];//make_pair
//unordered_map<pair<int,int>, int > S;
int H[M][M];
int in[N], out[N];
int ans = inf;
void dfs(int u,int step,int col,int sum)
{
if(step == n)
{
//cout << 1;
ans = min(ans, sum);
return;
}
if(!out[u])
{
for(int i = 1; i <= n; i ++)
{
if(!vis[i] && (!in[i] || vis[fa[i]]))
{
vis[i] = 1;
//dfs(i, step + 1, color_h[i], sum);
if(color_h[u] == color_h[i])
{
dfs(i, step + 1, color_h[i], sum);
}
else
{
dfs(i, step + 1, color_h[i], sum + 1);
}
vis[i] = 0;
}
}
//debug
}
for(int i = h[u]; i; i = ne[i])
{
int y = e[i];
if(!vis[y] && !(din[y] - 1))
{
din[y] --;
vis[y] = 1;
if(color_h[y] == color_h[u])
{
dfs(y, step + 1, col, sum);
}
else
{
dfs(y, step + 1, color_h[y], sum + 1);
}
vis[y] = 0;
din[y] ++;
}
if(!vis[y] && (din[y] - 1))
{
din[y] --;
for(int i = 1; i <= n; i ++)
{
if(!vis[i] && (!in[i] || vis[fa[i]]))
{
vis[i] = 1;
if(color_h[u] == color_h[i])
{
dfs(i, step + 1, color_h[i], sum);
}
else
{
dfs(i, step + 1, color_h[i], sum + 1);
}
vis[i] = 0;
}
}
din[y] ++;
}
}
}
signed main()
{
//f_{ic} : 在i点涂c号颜色
ios::sync_with_stdio(false);
cin >> n;
int maxx = 0, minn = inf;
int maxy = 0, miny = inf;
for(int k = 1; k <= n; k ++)
{
int x1,y1,x2,y2,col;
cin >> x1 >> y1 >> x2 >> y2 >> col;
maxx = max(maxx, x2);
maxy = max(maxy, y2);
minn = min(minn, x1);
miny = min(miny, y1);
if(!col_st[col])
{
col_st[col] = 1;
cnt_col ++;
}
for(int i = x1; i <= x2; i ++)
{
for(int j = y1; j <= y2; j ++)
{
color_h[k] = col;
H[i][j] = k;
}
}
}
for(int i = minn; i <= maxx; i ++)
{
for(int j = miny; j <= maxy; j ++)
{
if(H[i][j] != H[i + 1][j] && !pun[H[i][j]][H[i + 1][j]] && H[i][j] && H[i + 1][j])
{
add(H[i][j], H[i + 1][j]);
fa[H[i + 1][j]] = H[i][j];
pun[H[i][j]][H[i + 1][j]] = 1;
in[H[i + 1][j]] ++;
din[H[i + 1][j]] ++;
out[H[i][j]] ++;
}
}
}
/*
for(int i = minn; i <= maxx; i ++)
{
for(int j = miny; j <= maxy; j ++)
{
cout << H[i][j];
}
cout <<"\n";
}
*/
/*
for(int i = 1; i <= n; i ++)
{
cout << i <<":->";
for(int j = h[i]; j; j = ne[j])
{
cout << e[j] << "->";
}
cout << "\n";
}
*/
for(int i = 1; i <= n; i ++) if(!in[i]) top_cnt ++;
//dfs(i,step,col);
for(int i = 1; i <= n; i ++)
{
if(!in[i])
{
vis[i] = 1;
//memset(vis, 0 ,sizeof vis);
dfs(i,1,color_h[i],1);
vis[i] = 0;
}
}
cout << ans << endl;
return 0;
}