有没有人愿意调建图版的代码 球球了
查看原帖
有没有人愿意调建图版的代码 球球了
49677
miserExist楼主2021/9/28 21:50

没过的点似乎大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;
}
2021/9/28 21:50
加载中...