1034 Head of a Gang (30分) 連通圖判斷
阿新 • • 發佈:2020-08-24
題目
https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624
題意
給你一個有向圖
找出連通圖,按條件輸出
Sample Input 1:
8 59
AAA BBB 10
BBB AAA 20
AAA CCC 40
DDD EEE 5
EEE DDD 70
FFF GGG 30
GGG HHH 20
HHH FFF 10
Sample Output 1:
2
AAA 3
GGG 3
思路
比較簡單,就是細心讀題
- 節點數cnt>2
- 總權sum<K
- head是與他相連的邊權總和最大的那個點out_max
- 結果排序輸出ss
code(寫的有點亂)
#include <bits/stdc++.h> using namespace std; typedef long long ll; map<string,int>id; map<int,string>st; struct edge{ int time; int v; edge(int x,int y):time(x),v(y){} }; vector<edge>G[10006];//有向圖,便於求sum[] vector<edge>G1[10006];//無向圖,方便求聯通 int vis[10006];//訪問標記 int flag=0; int cnt[10006];//計數,每個幫派人數 int sum[10006];//幫派總權重 void DFS(int x) { if(vis[x]) return ; vis[x]=flag; cnt[flag]++; for(int i=0;i<G1[x].size();++i) DFS(G1[x][i].v); } struct an{ string s; int n; }temp; vector<an>ss; bool cmp(an x,an y) {return x.s<y.s;} int main() { int N,K; cin>>N>>K; int num=0; for(int i=0;i<N;++i) { string a,b; int c; cin>>a>>b>>c; if(id[a]==0) id[a]=(++num),st[num]=a; if(id[b]==0) id[b]=(++num),st[num]=b; G[id[a]].push_back(edge(c,id[b])); G1[id[a]].push_back(edge(c,id[b])); G1[id[b]].push_back(edge(c,id[a])); } for(int i=1;i<=num;++i) { if(vis[i]==0) { flag++; DFS(i); } } for(int i=1;i<=num;++i) { for(int j=0;j<G[i].size();++j) { sum[vis[i]]+=G[i][j].time; } } int ans=0; for(int i=1;i<=flag;++i) { if(cnt[i]>2 && sum[i]>K) { ans++; } } cout<<ans<<endl; for(int i=1;i<=flag;++i) { if(cnt[i]>2 && sum[i]>K) { int max_out=0,max_id=0; for(int j=1;j<=num;++j) { if(vis[j]==i) { int out=0; for(int k=0;k<G1[j].size();++k) { out+=G1[j][k].time; } if(out>max_out) { max_out=out; max_id=j; } } } temp.s=st[max_id]; temp.n=cnt[i]; ss.push_back(temp); } } sort(ss.begin(),ss.end(),cmp); for(int i=0;i<ss.size();++i) { cout<<ss[i].s<<" "<<ss[i].n<<endl; } return 0; }