Investigating Legions(乱搞)

Investigating Legions(乱搞)

思路:真就乱搞,随机化,搞一波矩阵,然后从 1 1 1开始遍历,把和它相连的点丢进一个数组,然后特判那些点的相连的点的 个数是否比当前数组一半大,是就可以认为他们是一伙的。

#include
using namespace std;
typedef long long ll;
const int N=305,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first
#define se second
#define pb push_back
int f[N][N],ans[N];
int main(){
	int n,s,t;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&s);
		memset(ans,-1,sizeof ans);
		vector<int>v;
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				char c;
				scanf("\n%c",&c);
				f[i][j]=f[j][i]=c-'0';
			}
			f[i][i]=1;
		}
		int id=0;
		for(int i=1;i<=n;i++){
			if(ans[i]!=-1) continue;
			v.clear();
			for(int j=1;j<=n;j++)
				if(f[i][j]&&ans[j]==-1) v.pb(j);
			for(int j=1;j<=n;j++){
				if(ans[j]!=-1) continue;
				int cnt=0;
				for(auto k:v)
					if(f[k][j]) cnt++;
				if(cnt>=v.size()/2) ans[j]=id;
			}
			id++;
		}
		for(int i=1;i<=n;i++) printf("%d ",ans[i]);
		printf("\n");
	}
	return 0;
}

你可能感兴趣的:(随机化)