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;
}
刚开始第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;
}
相关文章推荐
- pat 甲级 1034. Head of a Gang (30)
- PAT_A 1034. Head of a Gang (30)
- pat 1034. Head of a Gang (30)
- PAT甲级1034. Head of a Gang (30)
- PAT 1034. Head of a Gang(30)
- PAT 甲级 1034. Head of a Gang (30)
- 【PAT】1034. Head of a Gang (30)
- PAT (Advanced) 1034. Head of a Gang (30)
- PAT 1034. Head of a Gang (30)
- PAT 1034. Head of a Gang (30)
- PAT (Advanced Level) 1034. Head of a Gang (30) 黑帮头目,并查集
- PAT甲题题解-1034. Head of a Gang (30)-并查集
- PAT 1034. Head of a Gang (30)
- pat甲级1034. Head of a Gang (30)
- PAT 1034. Head of a Gang (30)(孤岛以及一个奇怪的cost的计算问题)
- PAT甲级 1034. Head of a Gang (30)
- PAT 1034. Head of a Gang (30) 并查集
- 1034. Head of a Gang (30)-PAT甲级真题(图的遍历dfs)
- Python实现Pat 1034. Head of a Gang (30)
- 【PAT】【Advanced Level】1034. Head of a Gang (30)