0
点赞
收藏
分享

微信扫一扫

并查集经典应用之染色模型

做个橙梦 2022-04-30 阅读 67
c++算法
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1000010;

int n, m, p, q;
int color[N], ptr[N];

void init()
{
    for(int i = 0; i < N; i ++ )    ptr[i] = i;
}

int find(int x)
{
    if(ptr[x] == x) return x;
    return ptr[x] = find(ptr[x]);
}

int main()
{
    init();
    
    cin >> n >> m >> p >> q;
    
    for(int i = m; i >= 1; i -- )//倒着染色
    {
        int a = (i * p + q) % n + 1, b = (i * q + p) % n + 1;
        int r = max(a, b), l = min(a, b);//处理一下顺序
        
        int pa = find(l);//找到指针指向的点
        while(pa <= r)
        {
            color[pa] = i;//染色
            ptr[pa] = find(pa + 1);//指针跳跃
            pa = ptr[pa];//下一个点
        }
    }
    
    //卡常数,输出必须用scanf
    for(int i = 1; i <= n; i ++ )   printf("%d\n", color[i]);

    
    return 0;
}

 

举报

相关推荐

0 条评论