连通分量问题,主要要考虑图里面有环,因为要计算一个连通分量的边权之和,先判断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;
}