【PAT甲级】1034 Head of a Gang (30 分)

题意:

输入两个正整数N和K(<=1000),接下来输入N行数据,每行包括两个人由三个大写字母组成的ID,以及两人通话的时间。输出团伙的个数(相互间通过电话的人数>=3),以及按照字典序输出团伙老大的ID和团伙的人数(团伙中通话时长最长的人视为老大,数据保证一个团伙仅有一名老大)。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 string s,s2;
 5 int x[1007],y[1007];
 6 vector<pair<int,int> >edge[20007];
 7 bool vis[20007];
 8 int val[20007];
 9 int mx=0;
10 int pos=0;
11 int ans[20007];
12 int num[20007];
13 int cnt=0;
14 int c[1007];
15 bool visedge[1007];
16 int sum2=0;
17 void dfs(int x){
18     if(!vis[x])
19         ++cnt;
20     vis[x]=1;
21     for(auto it:edge[x]){
22         if(visedge[it.second])
23             continue;
24         visedge[it.second]=1;
25         if(!vis[it.first]){
26             ++cnt;
27             vis[it.first]=1;
28         }
29         val[x]+=c[it.second];
30         val[it.first]+=c[it.second];
31         sum2+=c[it.second];
32         if(val[x]>mx){
33             mx=val[x];
34             pos=x;
35         }
36         dfs(it.first);
37     }
38 }
39 int main(){
40     int n,k;
41     cin>>n>>k;
42     for(int i=1;i<=n;++i){
43         cin>>s>>s2>>c[i];
44         x[i]=(s[0]-'A')*26*26+(s[1]-'A')*26+s[2]-'A';
45         y[i]=(s2[0]-'A')*26*26+(s2[1]-'A')*26+s2[2]-'A';
46         edge[x[i]].push_back({y[i],i});
47         edge[y[i]].push_back({x[i],i});
48     }
49     int sum=0;
50     for(int i=1;i<=n;++i){
51         sum2=0;
52         mx=0;
53         pos=0;
54         cnt=0;
55         if(!vis[x[i]])
56             dfs(x[i]);
57         if(cnt>2&&sum2>k){
58             ans[pos]=sum2;
59             num[pos]=cnt;
60             ++sum;
61         }
62     }
63     cout<<sum<<"\n";
64     for(int i=0;i<26*26*26;++i)
65         if(ans[i]){
66             char alp[3];
67             int tmp=i;
68             alp[0]=tmp/26/26;
69             tmp%=26*26;
70             alp[1]=tmp/26;
71             tmp%=26;
72             alp[2]=tmp;
73             for(int j=0;j<=2;++j){
74                 alp[j]+='A';
75                 cout<<alp[j];
76             }
77             cout<<" "<<num[i]<<"\n";
78         }
79     return 0;
80 }

 

 

 

posted @ 2019-09-15 03:43  sewage  阅读(245)  评论(0编辑  收藏  举报