求图的连通分量变形题
看了别人还有很多用并查集的
第一个问题是怎么存储
参考了别人,用map把字符和数字对应起来
第二个问题怎么求
复习之前求连通分量的方法,有几个错误点
dfs循环,主函数循环时 (j=1)
可能对递归还是理解不到位,有死记硬背的嫌疑
接下来就是对连通分量的变形,需要什么变量在递归的过程中求出
其中有三个点
1.求value值的时候 为什么不满足 brr[j] == 0 的也要加在里面
2. 向函数传参时使用&引用,来实现对实参的改变
3. value值加过后该边的值要清零防止死循环
第三个问题输出结果的存储
又用到了map,此时是为了 把三个值串联起来:head string number
为了使 head表示的string 去和 number 联系在一起,所以建立的是 map<string,int>
第四个问题是之前的,map指针输出
之前用的是set 定义指针 set<int>::iterator it
不确定map是不是可以直接推倒,查阅后发现可以 map<string,int>::iterator it
map 输出是 it->first ; it->second
#include <cstdio>
#include <iostream>
#include <map>
using namespace std;
map<string,int> start;
map<int,string> out;
map<string,int> sum;
int idnumber = 1;
int value[2200][2200];
int brr[2200];
int weight[2200];
int n, k;
int inpu(string s){
if(start[s] == 0){
start[s] = idnumber;
out[idnumber] = s;
return idnumber++;
}
else return start[s];
}
void dfs(int i,int &head,int &number, int &total){
brr[i] = 1;
number++;
if(weight[i] > weight[head]) head = i;
for(int j=1; j<idnumber; j++){
if(value[i][j] > 0 ){
total += value[i][j];
value[i][j] = value[j][i] = 0;
if(brr[j] == 0)
dfs(j,head,number,total);
}
}
}
int main(){
scanf("%d %d",&n, &k);
for(int i=0; i<n; i++){
string a, b;
int c;
cin >> a >> b >> c;
int id1 = inpu(a);
int id2 = inpu(b);
weight[id1] += c;
weight[id2] += c;
value[id1][id2] += c;
value[id2][id1] += c;
}
for(int i=1; i<idnumber; i++){
if(brr[i] == 0){
int number = 0, total = 0, head = i;
dfs(i,head,number,total);
if(number > 2 && total > k) sum[out[head]] = number;
}
}
cout << sum.size() << endl;
map<string,int>::iterator it;
for(it = sum.begin(); it != sum.end(); it++)
cout << it->first << " " << it->second << endl;
return 0;
}
回家之后写个总结吧,,做了这些题也好几个重复的了,英文标题记不得谁是谁了
落泪