Investigating Legions(乱搞)
思路:真就乱搞,随机化,搞一波矩阵,然后从 开始遍历,把和它相连的点丢进一个数组,然后特判那些点的相连的点的 个数是否比当前数组一半大,是就可以认为他们是一伙的。
#include<bits/stdc++.h>
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<int,int>
#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;
}