题目稍微有点复杂
最好用并查集,形成gang
第一次写输出的时候看错题目了,题目只要求按照gang的首个数字大小输出,不要求按照gang的人数排序,读题目要再小心一点
#include<iostream>
#include<vector>
using namespace std;
int K,N,M;
int t[1001][1001]={0};
int father[1001];
int findfather(int x){
if(father[x]==x){
return x;
}else{
int F=findfather(father[x]);
father[x]=F;
return F;
}
}
void Union(int a,int b){
int fta=findfather(a);
int ftb=findfather(b);
if(fta!=ftb){
father[fta]=ftb;
}
}
int main(){
cin>>K>>N>>M;
for(int i=1;i<=N;i++){
father[i]=i;
}
for(int i=0;i<M;i++){
int c,r,d;
scanf("%d %d %d",&c,&r,&d);
t[c][r]+=d;
}
vector<int> suspects;
for(int i=1;i<=N;i++){
int cnt1=0,cnt2=0;
for(int j=1;j<=N;j++){
if(i==j) continue;
if(t[i][j]<=5&&t[i][j]>0){
cnt1++;
if(t[j][i]>0) cnt2++;
}
}
if(cnt1>K&&cnt2*5<=cnt1){
suspects.push_back(i);
}
}
if(suspects.size()==0){
printf("None\n");
return 0;
}
for(int i=0;i<suspects.size()-1;i++){
for(int j=i+1;j<suspects.size();j++){
int x=suspects[i], y=suspects[j];
if(t[x][y]>0&&t[y][x]>0){
Union(x,y);
}
}
}
int tag[N+1]={0};
for(int i=0;i<suspects.size();i++){
int x=suspects[i];
if(tag[x]==1) continue;
tag[x]=1;
printf("%d",x);
for(int j=i+1;j<suspects.size();j++){
int y=suspects[j];
if(tag[y]==0&&findfather(x)==findfather(y)){
printf(" %d",y);
tag[y]=1;
}
}
printf("\n");
}
return 0;
}