PAT1034 Head of a Gang (30 分)

1.用两个map完成结点的string名字与int下标的双向映射。

2.结果也用map,自动实现按key字典序排列。

3.难免有细节在编写时考虑不周,需要在debug时调整。

(1)每个连通分量结点数目numCount的统计,初值为1,每增加一条边时,若另一个顶点尚未访问才++numCount。

(2)处理完一条边,需要把其权值清0防止重复添加。即:bool visited[MAX]是用来记录每个结点是否已访问(从而判定在DFStravel中需不需要对它DFS,还用于在每个DFS内部判定需不需要增加numCount);G[index][i] = G[i][index] = 0是为了防止重复添加某条边的权值(如处理A时加了一遍AB,若不清0则在处理B时又会加一遍AB),即判定需不需要处理某条边是用权值判定的。

4.使用memset函数需要添加

定义了STL中string字符串类的各种操作,定义了基于char*的字符串处理函数。所以用到string则需要并using namespace std,用到char*则需要

5.一开始连map都不怎么会用,耗了挺多时间也没调通。以后遇到花了较多时间还不行的,果断看答案、学相关知识,然后自己敲一遍。

#include 
#include 
#include 
#include 
#include 
#define MAX 2010
using namespace std;

int G[MAX][MAX];
int N, K;
map NameToNum;
map NumToName;
int weight[MAX] = {0};
int totalnode = 0;

bool visited[MAX] = {false};
void DFS(int index, int &numCount, int &head, int &totalWeight){
    visited[index] = true;
//    numCount++;
    if (weight[index] > weight[head]) {
        head = index;
    }
    for (int i=0; i 0) {
            if(visited[i] == false){
                numCount++;
            }
            totalWeight += G[index][i];
            G[index][i] = 0;
            G[i][index] = 0;
            DFS(i, numCount, head, totalWeight);
        }
    }
}


int countBlock = 0;
map heads;
void DFStravel(){
    for (int i=0; i 2 && totalWeight > K) {
                countBlock++;
                heads[NumToName[head]] = numCount;
            }
        }
    }
}

int main(){
    memset(G, -1, sizeof(G));
    scanf("%d %d", &N, &K);
    for (int i=0; i::iterator it = heads.begin(); it!=heads.end(); it++) {
        cout<first<<" "<second<

 

你可能感兴趣的:(PAT,PAT,1034,Head,of,a,Gang,DFS,图的遍历)