Codeforces 650C Table Compression (并查集+拓扑排序)

原创 2016年05月31日 16:14:30

解析:不看tags都意识不到用图论。

一个位置对应一个节点,对于每行每列,值相同的用并查集union一起,值不相同的,值小的节点指向值大的节点。

压缩后节点的值是到该节点的最长的链的长度,可以通过拓扑排序求得。


[code]:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;
const int maxn = 1e6+5;

struct Nod{
    int b,next;
    void init(int b,int next){
        this->b=b;this->next=next;
    }
}buf[maxn<<2];
int n,m,a[maxn],b[maxn],d[maxn],deg[maxn];
int V,len,E[maxn],par[maxn];
int ord[maxn];
queue<int> que;

bool cmp(const int &i,const int &j){
    return a[i] < a[j];
}

void init(){
    V = n*m;
    len = 0;
    memset(E,-1,sizeof(E));
    for(int i = 0;i < V;i++) par[i] = i;
}
int find(int x){
    return par[x]==x?x:par[x]=find(par[x]);
}
void unite(int x,int y){
    x = find(x),y = find(y);
    if(x == y) return;
    par[y] = x;
}
void add_edge(int a,int b){
    buf[len].init(b,E[a]);E[a]=len++;
    deg[b]++;
}
void pre_preocess(){
    int i,j;
    for(i = 0;i < n;i++){
        for(j = 0;j < m;j++){
            ord[j] = i*m+j;
        }
        sort(ord,ord+m,cmp);
        for(j = 1;j < m;j++){
            if(a[ord[j-1]]==a[ord[j]]) unite(ord[j],ord[j-1]);
        }
    }
    for(j = 0;j < m;j++){
        for(i = 0;i < n;i++){
            ord[i] = i*m+j;
        }
        sort(ord,ord+n,cmp);
        for(i = 1;i < n;i++){
            if(a[ord[i-1]]==a[ord[i]]) unite(ord[i],ord[i-1]);
        }
    }
}
void sol(){
    int i,j,u,v;
    for(i = 0;i < V;i++) if(find(i)==i&°[i]==0) que.push(i);
    while(!que.empty()){
        u = que.front();que.pop();
        for(i = E[u];i != -1;i = buf[i].next){
            v = buf[i].b;
            d[v] = max(d[v],d[u]+1);
            if(--deg[v]==0){
                que.push(v);
            }
        }
    }
    for(i = 0;i < V;i++){
        printf("%d ",d[find(i)]+1);
        if((i+1)%m==0) putchar('\n');
    }
}

int main(){
    int i,j;
    scanf("%d%d",&n,&m);
    init();
    for(i = 0;i < n*m;i++) scanf("%d",&a[i]);
    pre_preocess();
    for(i = 0;i < n;i++){
        for(j = 0;j < m;j++){
            ord[j] = i*m+j;
        }
        sort(ord,ord+m,cmp);
        for(j = 1;j < m;j++){
            if(a[ord[j-1]]==a[ord[j]]) continue;
            add_edge(find(ord[j-1]),find(ord[j]));
        }
    }
    for(j = 0;j < m;j++){
        for(i = 0;i < n;i++){
            ord[i] = i*m+j;
        }
        sort(ord,ord+n,cmp);
        for(i = 1;i < n;i++){
            if(a[ord[i-1]]==a[ord[i]]) continue;
            add_edge(find(ord[i-1]),find(ord[i]));
        }
    }
    sol();
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【Codeforces650C】Table Compression【并查集】【拓扑排序】

先排序,把大小相同的元素合并成一个集合。注意这些元素不一定在位置上相邻。 然后再排序,从小到大建边。 最后做个bfs,每个点的答案为并查集中的最大值。 /* Footprints In The B...

Codeforces Round #345 (Div. 1) C. Table Compression (并查集)

Little Petya is now fond of data compression algorithms. He has already studied gz, bz, zip algorith...

Codeforces 650C Table Compression

C. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes ...
  • abgnwl
  • abgnwl
  • 2016年03月12日 14:11
  • 722

【Codeforces Round 345 (Div 1) C】【并查集缩环+拓扑最长路】Table Compression nm矩形权值缩小大小关系不变

C. Watchmen time limit per test 3 seconds memory limit per test 256 megabytes input...

hdu 1811 rank of tetras 拓扑排序+并查集

这题写了几天了,好几次写了一半又删了的,发现拓扑还是用queue好啊 1.3种结果的优先关系conflict>uncertain>ok,只要是conflict就不是看后两者了,如果不是只有判了是un...

hdu 1811 Rank of Tetris 并查集+拓扑排序,,提高题

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

hdu 1811 并查集+拓扑排序

Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。 为了更好的符合那些爱好者的喜好,Lele又想了一个...

【HDU - 1811 Rank of Tetris】 并查集+拓扑排序

B - Rank of Tetris 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。 为了更好的符合那些爱好者的喜好,Lele又想...
  • lyg_air
  • lyg_air
  • 2017年07月25日 20:51
  • 49

【HDU】1811 Rank of Tetris 并查集+拓扑排序

传送门:【HDU】1811 Rank of Tetris、 ti mu

hdu 1811Rank of Tetris (并查集+拓扑排序)

题意: n个队,m种描述(a>b 或 a=b 或 aa同时存在;②:存在环),信息是否不齐全(排名顺序有多种可能:某次入度为0的>1个。) 思路: 由于当存在冲突和信息不全时,返回冲突。所以先用并查...
  • LiWen_7
  • LiWen_7
  • 2012年08月13日 15:54
  • 724
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces 650C Table Compression (并查集+拓扑排序)
举报原因:
原因补充:

(最多只允许输入30个字)