• 【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<<"
    ";
    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 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    可图性判定HavelHakimi定理
    并查集入门
    js数组和函数应用
    DOM用法及应用
    javascript基础知识
    表单
    PHP变量
    30天自制操作系统开发笔记——IDT中断描述符表
    《30天自制操作系统》学习笔记——汇编程序磁盘BIOS调用
    汇编指令: LGDT、LIDT、LLDT、LMSW、LOADALL、LOADALL286、LOCK、LODSB、LODSW、LODSD
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11521016.html
Copyright © 2020-2023  润新知