PAT.A1034 Cabeza de una pandilla

Volver a contenidosInserte la descripción de la imagen aquí

Titulo

Dada la duración de una conversación entre varias personas (consideradas como una ventaja no dirigida), divídalas en grupos de acuerdo con estas conversaciones. El peso de borde total de cada grupo se establece en la suma de la duración de todas las llamadas en el grupo, y el peso en puntos de cada persona se establece en la suma de la duración de las llamadas en las que la persona participa. Ahora se da un umbral K, y siempre y cuando el margen total de un grupo exceda K, y el número de miembros exceda 2, el grupo se considera como una "pandilla", y la persona con el mayor punto de peso en el grupo se considera como Jefe Se requiere dar salida al número de "pandillas criminales", y dar a conocer los nombres de los líderes y el número de miembros de cada "pandilla criminal" en orden ascendente de los nombres de los líderes.

Muestra (se puede copiar)

8 59
AAA BBB 10
BBB AAA 20
AAA CCC 40
DDD EEE 5
EEE DDD 70
FFF GGG 30
GGG HHH 20
HHH FFF 10
//output
2
AAA 3
GGG 3
8 70
AAA BBB 10
BBB AAA 20
AAA CCC 40
DDD EEE 5
EEE DDD 70
FFF GGG 30
GGG HHH 20
HHH FFF 10
//output
0

Puntos a tener en cuenta

  1. Esta pregunta usa la matriz de adyacencia para almacenar el gráfico de registro de llamadas, si usa la tabla de adyacencia será bastante problemático.
  2. Además de utilizar el recorrido DFS, este problema también se puede resolver mediante una verificación, pero es relativamente engorroso. Al fusionar y verificar conjuntos, recuerde mantener el nodo con el valor completo más grande como nodo raíz.
#include <bits/stdc++.h>
using namespace std;

const int maxn=2010;
int n,k,num=0;//总通话记录数,阈值,总人数 
map<string,int> stringint;//姓名->编号
map<int,string> intstring;//编号->姓名
map<string,int> gang;//黑帮头目--黑帮人数 
int G[maxn][maxn]={0};//通话记录图,邻接矩阵存储 
int W[maxn] ={0};//每个人的权重 
bool flag[maxn]={false};
int change(string s){
	if(stringint.find(s)!=stringint.end()){
		return stringint[s];
	}else{
		stringint[s]=num;
		intstring[num]=s;
		return num++;
	}
}
void DFS(int now,int& head,int& numperson,int& totalw){
	flag[now]=true;
	numperson++;
	if(W[now]>W[head])head=now;
	for(int i=0;i<num;i++){
		if(G[now][i]>0){
			totalw+=G[now][i];
			G[now][i]=G[i][now]=0;//删除该边,防止回头
			if(!flag[i])DFS(i,head,numperson,totalw);
		}
	}
}
int main(){
    int w;
    string s1,s2;
	cin>>n>>k;
	for(int i=0;i<n;i++){
		cin>>s1>>s2>>w;
		int id1=change(s1);
		int id2=change(s2);
		W[id1]+=w;
		W[id2]+=w;
		G[id1][id2]+=w;
		G[id2][id1]+=w;
	}
	for(int i=0;i<num;i++){
		if(!flag[i]){
			int head=i,numperson=0,total=0;
			DFS(i,head,numperson,total);
			if(numperson>2&&total>k)gang[intstring[head]]=numperson;
		}
	}
	cout<<gang.size()<<endl;
	for(map<string,int>::iterator it=gang.begin();it!=gang.end();it++){
		cout<<it->first<<" "<<it->second<<endl;
	}
	return 0;
}
177 artículos originales publicados · elogiados 5 · visitas 6655

Supongo que te gusta

Origin blog.csdn.net/a1920993165/article/details/105559503
Recomendado
Clasificación