[ZOJ3781]Paint the Grid Reloaded

Posted skylee的OI博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ZOJ3781]Paint the Grid Reloaded相关的知识,希望对你有一定的参考价值。

思路:

先用DFS缩点,然后BFS找出每个点出发能到达的最长路,取$min$。
注意多组数据,初始化一定要仔细,刚开始存边的$e$忘记初始化,一直WA,调了半个晚上。
一开始和网上的题解对拍$T=1$一直对不出错,后来测了大数据才发现是初始化的问题。

 1 #include<queue>
 2 #include<vector>
 3 #include<cstring>
 4 #include<iostream>
 5 const int inf=0x7fffffff;
 6 const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
 7 int n,m;
 8 const int N=42,V=1601;
 9 bool a[N][N],b[N][N];
10 int g[N][N];
11 bool map[V][V];
12 int cnt,ans;
13 std::vector<int> e[V];
14 inline void init() {
15     cnt=0,ans=inf;
16     memset(a,0,sizeof a);
17     memset(g,0,sizeof g);
18     memset(map,0,sizeof map);
19     memset(b,0,sizeof b);
20     for(int i=1;i<=n;i++) {
21         b[i][0]=b[i][m+1]=true;
22     }
23     for(int j=1;j<=m;j++) {
24         b[0][j]=b[n+1][j]=true;
25     }
26     for(int i=0;i<V;i++) e[i].clear();
27 }
28 inline void add_edge(const int u,const int v) {
29     if(!map[u][v]) {
30         e[u].push_back(v);
31         map[u][v]=true;
32     }
33 }
34 void dfs(const int x,const int y) {
35     b[x][y]=true;
36     for(int i=0;i<4;i++) {
37         int xx=x+dx[i],yy=y+dy[i];
38         if(g[xx][yy]&&g[xx][yy]!=g[x][y]) {
39             add_edge(g[x][y],g[xx][yy]);
40             add_edge(g[xx][yy],g[x][y]);
41         }
42         if(b[xx][yy]) continue;
43         if(a[x][y]==a[xx][yy]) {
44             g[xx][yy]=g[x][y];
45             dfs(xx,yy);
46         }
47     }
48 }
49 bool v[V];
50 void bfs(const int s) {
51     memset(v,0,sizeof v);
52     std::queue<std::pair<int,int> > q;
53     q.push(std::make_pair(s,0));
54     v[s]=true;
55     int max=0;
56     while(!q.empty()) {
57         int x=q.front().first,d=q.front().second;
58         q.pop();
59         for(unsigned i=0;i<e[x].size();i++) {
60             int &y=e[x][i];
61             if(v[y]) continue;
62             q.push(std::make_pair(y,d+1));
63             v[y]=true;
64         }
65         max=std::max(max,d);
66     }
67     ans=std::min(ans,max);
68 }
69 int main() {
70     std::ios_base::sync_with_stdio(false);
71     std::cin.tie(NULL);
72     int T;
73     std::cin>>T;
74     while(T--) {
75         std::cin>>n>>m;
76         init();
77         for(int i=1;i<=n;i++) {
78             for(int j=1;j<=m;j++) {
79                 char ch;
80                 std::cin>>ch;
81                 a[i][j]=ch==O;
82             }
83         }
84         for(int i=1;i<=n;i++) {
85             for(int j=1;j<=m;j++) {
86                 if(b[i][j]) continue;
87                 g[i][j]=++cnt;
88                 dfs(i,j);
89             }
90         }
91         for(int i=1;i<=cnt;i++) bfs(i);
92         std::cout<<ans<<std::endl;
93     }
94     return 0;
95 }

 

以上是关于[ZOJ3781]Paint the Grid Reloaded的主要内容,如果未能解决你的问题,请参考以下文章

ZOJ - 3781 Paint the Grid Reloaded 题解

ZOJ - 3780-Paint the Grid Again-(拓扑排序)

ZOJ 3780 Paint the Grid Again(隐式图拓扑排序)

ZOJ 3780 E - Paint the Grid Again 拓扑排序

Paint the Grid Reloaded(缩点,DFS+BFS)

ZOJ 1610 Count the Colors(区间染色)