您的位置:首页 > 其它

pat-a1034. Head of a Gang (30)

2017-07-12 17:31 337 查看
一开始的方向都错了。。这个题对边进行深搜,开始一直对点进行深搜的。在边搜索的同时,把边的权重放进两个节点的权重数组里面。同时用深搜确定有多少组织。每个组织有哪些成员存起来。权重和大于阈值的输出头领以及人数就行了。

刚开始第3测试用例一直段错误。。查了半天才反应过来1000条通话记录最多能有2000人。。数组开小了。。

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
struct gang{
string name;
int n;
gang(string a,int b):name(a),n(b){
}
};
vector<gang> vg;
map<string,int>code;
map<int,string>encode;
map<int,vector<int> >tree;
int visit[2010];
int w[2010][2010];
int v[2010];
int k=0,ans=0,p=1;
bool cmd(const gang& a,const gang& b){
return a.name<b.name;
}
void dfs(int t){
if(visit[t]==0) tree[ans].push_back(t);
int va=0;
visit[t]=1;
for(int i=1;i<p;++i){
if(w[t][i]){
v[t]+=w[t][i];
v[i]+=w[t][i];
w[t][i]=w[i][t]=0;
if(visit[i]==0){
tree[ans].push_back(i);
visit[i]=1;
}
dfs(i);
}
}
}
int main(){
int n;
cin>>n>>k;
string n1,n2;
int t;
while(n--){
cin>>n1>>n2>>t;
if(code[n1]==0){
code[n1]=p;
encode[p]=n1;
p++;
}
if(code[n2]==0){
code[n2]=p;
encode[p]=n2;
p++;
}
int f=code[n1];
int to=code[n2];
w[f][to]+=t;
w[to][f]+=t;
}
for(int i=1;i<p;++i){
if(visit[i]==0){
dfs(i);
ans++;
}
}
int ans1=0;
for(int i=0;i<ans;++i){
int ma=0;
int pos=0,temp=0;
int len=tree[i].size();
for(int j=0;j<len;++j){
temp+=v[tree[i][j]];
if(ma<v[tree[i][j]]){
ma=v[tree[i][j]];
pos=tree[i][j];
}
}
temp/=2;
if(temp>k&&len>2){
ans1++;
vg.push_back(gang(encode[pos],len));
}
}
cout<<ans1<<endl;
if(ans1){
sort(vg.begin(),vg.end(),cmd);
for(int i=0;i<ans1;++i) cout<<vg[i].name<<' '<<vg[i].n<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: