PAT甲级 1034 Head of a Gang (30分)

连通分量问题,主要要考虑图里面有环,因为要计算一个连通分量的边权之和,先判断G数组和visit数组再去加边权,递归,那么会漏加。所以我们先判断G数组,加上边权,在判断visit数组,再去递归,会多加,所以上述步骤,加上边权之后,把G数组变0,防止多加。

#include <bits/stdc++.h>
using namespace std;
int n = 0, m, k, t, G[2010][2010] = {}, Time[2010] = {};
bool visit[2010] = {};
void DFS(int s, int &head, int &num, int &sum)
{
    visit[s] = true;
    num++;
    if(Time[s] > Time[head]) head = s;
    for(int i = 0; i < n; i++){
        if(G[s][i]){
            sum += G[s][i];
            G[s][i] = G[i][s] = 0;
            if(visit[i] == false) DFS(i, head, num, sum);
        }
    }
}
int main()
{
    string str1, str2;
    map<string, int> mp, rec;
    map<int, string> mp2;
    cin >> m >> k;
    for(int i = 0; i < m; i++){
        cin >> str1 >> str2 >> t;
        if(mp.find(str1) == mp.end()){
            mp[str1] = n;
            mp2[n] = str1;
            n++;
        }
        if(mp.find(str2) == mp.end()){
            mp[str2] = n;
            mp2[n] = str2;
            n++;
        }
        G[mp[str1]][mp[str2]] += t;
        G[mp[str2]][mp[str1]] += t;
        Time[mp[str1]] += t;
        Time[mp[str2]] += t;
    }
    for(int i = 0; i < n; i++){
        if(visit[i] == false){
            int head = i, num = 0, sum = 0;
            DFS(i, head, num, sum);
            if(num > 2 && sum > k) rec[mp2[head]] = num;
        }
    }
    printf("%d\n", rec.size());
    for(map<string, int>::iterator it = rec.begin(); it != rec.end(); it++){
        cout << it->first << " " << it->second << "\n";
    }
    return 0;
}
发布了29 篇原创文章 · 获赞 0 · 访问量 363

猜你喜欢

转载自blog.csdn.net/qq_33942309/article/details/105684128