题意:
输入两个正整数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<<" "; 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]<<" "; 78 } 79 return 0; 80 }