以及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;
}