【1034】Head of a Gang (30 分)

简介: 【1034】Head of a Gang (30 分)【1034】Head of a Gang (30 分)
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<algorithm>  
#include<map>
#include<vector>
#include<queue> 
using namespace std;  
const int maxn=2010; //总人数
map<int, string> intToString; //编号-》姓名
map<string,int> stringToInt;  //姓名-》编号
map<string,int> Gang;  //head->人数
int G[maxn][maxn]={0};
int weight[maxn]={0};  //邻接矩阵G、点权weight
int n,k,numPerson=0; //边数n、下限k及总人数numPerson
bool vis[maxn]={false};  //标记是否被访问
//DFS函数访问单个连通块,nowVisit为当前访问的标号
//head为头目,numMember为成员编号,totalValue为连通块的总边权
void DFS(int nowVisit,int& head, int& numMember,int& totalValue){
  numMember++;//成员人数加1
  vis[nowVisit]=true; //标记nowVisit已访问
  if(weight[nowVisit]>weight[head]){ 
    head=nowVisit; //当前访问结点的点权大于头目的点权,则更新头目
  }
  for(int i=0;i<numPerson;i++){ //枚举所有人
    if(G[nowVisit][i]>0){  //如果从nowVisit能到达i
      totalValue += G[i][nowVisit] ; //连通块的总边权增加该边权
      G[nowVisit][i]=G[i][nowVisit]=0;  //删除这条边,防止回头
      if(vis[i] == false){ //如果i未被访问,则递归访问i
        DFS(i,head,numMember,totalValue);
      }
    }
  }
}
//DFSTrave函数遍历整个图,获取每个连通块的信息
void DFSTrave(){ 
  for(int i=0;i<numPerson;i++){ //枚举所有人
    if(vis[i]==false){  //如果i未被访问
      int head=i,numMember=0,totalValue=0; //头目、成员数、总边权
      DFS(i,head,numMember,totalValue); //遍历i所在的连通块
      //如果成员数大于2且总边权大于k
      if(numMember>2 && totalValue >k){
        //head的人数为numMember
        Gang[intToString[head] ]=numMember;
      }
    }
  }
}
//change函数返回姓名str对应的编号
int change(string str){
  if(stringToInt.find(str) != stringToInt.end()){ //如果str已经出现过
    return stringToInt[str]; //返回编号
  }else{
    stringToInt[str]=numPerson; //str的编号为numPerson
    intToString[numPerson]=str; //numPerson对应str
    return numPerson++;  //总人数加1
  }
}
int main(){   
  int w;
  string str1,str2;
  cin >> n>>k;
  for(int i=0; i<n; i++){ 
    cin >> str1>>str2>>w; //输入边的两个端点和点权
    int id1=change(str1);  //将str1转换为编号id1
    int id2=change(str2); //将str2转换为编号id2
    weight[id1]+=w;  //id1的点权增加w
    weight[id2]+=w;  //id2的点权增加w
    G[id1][id2]+=w;  //边id1-》id2的边权增加w
    G[id2][id1]+=w; //边id2-》id1的边权增加w
  }
  DFSTrave();  //遍历整个图的所有连通块,获取Gang的信息
  cout <<Gang.size()<< endl; //Gang的个数
  map<string,int>::iterator it;
  for(it=Gang.begin(); it!=Gang.end();it++){ //遍历所有Gang
    cout << it->first  << " "<< it->second<<endl; //输出信息
  }
  system("pause"); 
    return 0;   
}
相关文章
|
4月前
1043 输出PATest (20 分)
1043 输出PATest (20 分)
|
XML 前端开发 网络协议
|
移动开发 数据可视化 程序员
Head 介绍|学习笔记
快速学习 Head 介绍。
Head 介绍|学习笔记
|
开发工具 git 开发者
Head 使用|学习笔记
快速学习 Head 使用。
Head 使用|学习笔记
|
开发者 索引
Head 使用 | 学习笔记
快速学习 Head 使用
Head 使用 | 学习笔记
|
前端开发 JavaScript 开发者
L1-032 Left-pad (20 分)
L1-032 Left-pad (20 分)
92 0
|
前端开发 JavaScript 开发者
L1-8 Left-pad (20 分)
根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用*去填充字符串GPLT,使之长度为10,调用left-pad的结果就应该是******GPLT。Node社区曾经对left-pad紧急发布了一个替代,被严重吐槽。下面就请你来实现一下这个模块。
112 0
|
C语言 C++
1043 输出PATest (20 分)
给定一个长度不超过 104 的、仅由英文字母构成的字符串。请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符。当然,六种字符的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按 PATest 的顺序打印,直到所有字符都被输出。
93 0
【1083】List Grades (25 分)
【1083】List Grades (25 分) 【1083】List Grades (25 分)
99 0