topcoder ce
  • 板块学术版
  • 楼主SFlyer
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/11/3 19:54
  • 上次更新2023/11/3 21:15:32
查看原帖
topcoder ce
489890
SFlyer楼主2023/11/3 19:54

Your code did not compile: compiling generated stub/wrapper took too long (not done after 30023 ms)

#include <bits/stdc++.h>

using namespace std;

#define de(x) cout<<#x<<"="<<x<<endl

using ll = long long;

const int N = 55;

class ThreeColorability {
	private:
		int n,m,fa[N],a[N][N],vis[N],fl=1;
		int adj[N][N];
		vector<int> g[N];
		void init(){
			memset(vis,-1,sizeof vis);
			memset(adj,0,sizeof adj);
			for (int i=0; i<N; i++){
				fa[i]=i;
			}
		}
		int ff(int x){
			return x==fa[x]?x:fa[x]=ff(fa[x]);
		}
		int merge(int x,int y){
			x=ff(x);
			y=ff(y);
			if (x!=y){
				fa[x]=y;
			}
		}
		void dfs(int u,int col){
			if (~vis[u]){
				if (vis[u]!=col){
					fl=0;
				}
				return;
			}
			vis[u]=col;
			for (auto v : g[u]){
				dfs(v,col^1);
			}
		}
	public:
		vector<string> lexSmallest(vector<string> cells){
			init();
			n=cells.size();
			m=cells[0].size();
			for (int i=0; i<n; i++){
				for (int j=0; j<m; j++){
					char ch=cells[i][j];
					if (ch=='?'){
						a[i][j]=-1;
					}
					else if (ch=='N'){
						a[i][j]=0;
					}
					else{
						a[i][j]=1;
					}
				}
			}
			for (int i=1; i<n; i++){
				for (int j=0; j<m; j++){
					for (int k=j+1; k<m; k++){
						if (a[i][j]>=0 && a[i][k]>=0){
							if (a[i][j]!=a[i][k]){
								adj[j][k]=1;
								adj[k][j]=1;
							}
							else{
								merge(j,k);
							}
						}
					}
				}
			}
			for (int i=0; i<m; i++){
				for (int j=i+1; j<m; j++){
					if (adj[i][j]){
						int x=ff(i);
						int y=ff(j);
						g[x].push_back(y);
						g[y].push_back(x); 
					}
				}
			}
			for (int i=0; i<m; i++){
				if (~a[0][i]){
					dfs(ff(i),a[0][i]);
				}
			}
			for (int i=0; i<m; i++){
				if (vis[ff(i)]<0){
					dfs(ff(i),0);
				}
			}
			if (!fl){
				return {};
			}
			// 调整
			for (int i=0; i<m; i++){
				a[0][i]=vis[ff(i)];
			}
			for (int i=1; i<n; i++){
				bool h1=0,dif=0;
				for (int j=0; j<m; j++){
					if (~a[i][j]){
						h1=1;
						dif|=(a[0][j]!=a[i][j]);
					}
				}
				if (!h1){
					if (a[0][0]!=0){
						dif=1;
					}
				}
				for (int j=0; j<m; j++){
					a[i][j]=a[0][j]^dif;
				}
			} 
			vector<string> res;
			res.resize(n);
			for (int i=0; i<n; i++){
				res[i].resize(m);
				for (int j=0; j<m; j++){
					if (a[i][j]){
						res[i][j]='Z';
					}
					else{
						res[i][j]='N';
					}
				}
			}
			return res;
		}
}; 

ThreeColorability 这一题。

2023/11/3 19:54
加载中...