PAT甲級 1034 Gang(存在疑問)

以及codeblocks需要在setting裏設置支持c++11新標準才能用auto類型!
先附上柳婼大神的代碼:
來源:https://blog.csdn.net/liuchuo/article/details/52291920

解題總結:

1.DFS遍歷圖求連通量個數我完全忘記怎麼寫

柳婼是通過利用dfsTravel函數每次調用一次dfs函數都是一個新的連通塊,dfs利用引用調用,完成一整個連通塊的遍歷使得該連通塊dfs完成後回到dfsTravel函數時該連通塊的相關信息(成員個數,總共邊權重)得以暫時保存,然後若符合題目對gang的要求則存入map<string, int>
我用struct來存一個學生的所有信息(姓名,點權重),其下標即爲其編號。
注意:不知爲何必須當滿足條件用map來存儲最終連通量信息纔是30分,而若是遍歷所有連通塊輸出滿足連通塊條件的信息則只有22分。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include <map>
using namespace std;

const int maxn = 1000 + 5;
int n, k;
bool vis[2*maxn];
int pic[2*maxn][2*maxn];//邊權

//人:點權,名字,
struct node{
    int weight;
    string name;
}per[2*maxn];

struct bound{
    int totalWeight = 0;
    int numMember = 0;
    int boss;
}Gang[maxn];

map<string, int> match;//名字對應struct數組下標
map<string, int> ans;
int numMem = 0, numGang = 0;

int stofunc(string s){
    if(match[s] == 0){
        match[s] = ++numMem;
        per[numMem].name = s;
        return numMem;
    }
    else
        return match[s];
}
//功能是把更新該點並往下遞歸遍歷所有與該點相連的點
void dfs(int x){
    vis[x] = true;
    Gang[numGang].numMember++;
    if(per[x].weight > per[Gang[numGang].boss].weight)
        Gang[numGang].boss = x;
        //往下遍歷連接點/邊
    for(int i = 1; i <= numMem; i++){
        //不可以直接通過該點是否遍歷過來判斷!(我只前犯的錯誤)...>
        if(pic[x][i] > 0){
            Gang[numGang].totalWeight += pic[x][i];
            pic[x][i] = pic[i][x] = 0;//將該圖遍歷後,將這個邊置零。(防止死循環)
            //若該點沒有遍歷過,則以該點爲基點往下遍歷
            if(vis[i] == false)
                dfs(i);
        }
    }
}

//在這個函數裏,每次進去dfs一次都是一個新的連通塊!要檢驗該連通塊是否滿足要求只能在調用dfs後再判斷!
void dfsTravel(){
    for(int i = 1; i <= numMem; i++){
        if(vis[i] == true) continue;
        ++numGang;
        Gang[numGang].boss = i;
        Gang[numGang].numMember = 0;
        Gang[numGang].totalWeight = 0;
        dfs(i);
        if(Gang[numGang].numMember > 2 && Gang[numGang].totalWeight > k){
            int bossIdx = Gang[numGang].boss;
            ans[per[bossIdx].name] = Gang[numGang].numMember;
        }
    }
}

int main(){
    scanf("%d%d", &n, &k);
    for(int i = 0; i < n; i++){
        string s1, s2;
        int t;
        cin>>s1>>s2>>t;
        int n1 = stofunc(s1), n2 = stofunc(s2);
        per[n1].weight += t;
        per[n2].weight += t;
        pic[n1][n2] += t;
        pic[n2][n1] += t;
    }

    dfsTravel();

    cout<<ans.size()<<endl;

    for(auto it = ans.begin(); it != ans.end(); it++){
        cout << it->first << " " << it->second <<endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章