1034 Head of a Gang (30 分)(图的遍历or并查集)

摘要:
=平方英寸。end()){returnsi[x];}否则{si[x]=cnt;is[cnt]=x;returncnt++;}}Voiddfs{if{head=now;//判断领先者}number++//增加数量vis〔now〕=true;对于{if{num+=mp[now][i];//Sum mp[now][i]=mp[i][now]=0;if(!Vis[i]){Vis[i]=true;dfs;}}}Intmain(){fill;fill;infll;intn,k;cin˃˃n˃˃k;对于{stringa,b;intNum;cin˃˃a˃˃b˃˃Num;intx=求解;inty=求解;weight[x]+=Num;//每个点都需要weight[y]+=Number;mp[x][y]++=Num对于{if(!vis[i]){inthead=i;intnumber=0;intnum=0;vis[i]=true;dfs;如果{gang[是[head]]=number;}}cout˂˂帮派。size()˂˂endl;对于{cout˂˂it.first˂˂“”˂˂it.second˂˂endl;}return0;}当查询集合本身时,我们使用AC来查找其背后的代码。我们不仔细看,也不知道这意味着什么。无论如何,这都很混乱#includeusingspacestd;组成N=3000;整数[N];intp[N];整数[N];intmp[N][N];intfindth{ifreturnx;returnp[x]=findth;}如果(xx!

1034 Head of a Gang (30 分)(图的遍历or并查集)第1张

dfs

#include<bits/stdc++.h>

using namespace std;
const int N=3000;
int mp[N][N];
int weight[N];
int vis[N];
map<string,int>si;
map<int,string>is;
map<string,int>gang;
int cnt;
//进行转换
int solve(string x) { if(si.find(x)!=si.end()){ return si[x]; } else{ si[x]=cnt; is[cnt]=x; return cnt++; } } void dfs(int now,int &head,int &number,int &num) { if(weight[now]>weight[head]){ head=now;//判断头目 } number++;//增加数量 vis[now]=true; for(int i=0;i<cnt;i++){ if(mp[now][i]>0){ num+=mp[now][i];//总和 mp[now][i]=mp[i][now]=0; if(!vis[i]){ vis[i]=true; dfs(i,head,number,num); } } } } int main() { fill(weight,weight+N,0); fill(mp[0],mp[0]+N*N,0); fill(vis,vis+N,false); int n,k; cin>>n>>k; for(int i=0;i<n;i++){ string a,b; int Num; cin>>a>>b>>Num; int x=solve(a); int y=solve(b); weight[x]+=Num;//每个点都需要 weight[y]+=Num; mp[x][y]+=Num; mp[y][x]+=Num; } for(int i=0;i<cnt;i++){ if(!vis[i]){ int head=i; int number=0; int num=0; vis[i]=true; dfs(i,head,number,num); if(number>2&&num>k){ gang[is[head]]=number; } } } cout<<gang.size()<<endl; for(auto &it:gang){ cout<<it.first<<" "<<it.second<<endl; } return 0; }

并查集

自己做的时候用的是并查集 AC了 就是暴力找 后面的代码自己不仔细看也不知道都啥意思 反正很乱

#include<bits/stdc++.h>

using namespace std;
const int N=3000;
int weight[N];
int p[N];
int sum[N];
int mp[N][N];
int findth(int x)
{
    if(x==p[x]) return x;
    return p[x]=findth(p[x]);
}
void unionn(int x,int y)
{
    int xx=findth(x);
    int yy=findth(y);
    if(xx!=yy){
        p[yy]=xx;
        sum[xx]+=sum[yy];
    }
}

map<string,int>si;
map<int,string>is;
map<string,int>gang;
int cnt;
int solve(string a)
{
    if(si.find(a)!=si.end()) return si[a];
    else{
        si[a]=cnt;
        is[cnt]=a;
        return cnt++;
    }
}
struct node
{
    int id;
    int sum1;
    node(int _id,int _sum):id(_id),sum1(_sum){}
};

int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++){
        p[i]=i;
        sum[i]=1;
    }
    cnt=0;
    memset(mp,0,sizeof(mp));
    for(int i=0;i<n;i++){
        string a,b;
        cin>>a>>b;
        int num;
        cin>>num;
        int x=solve(a);
        int y=solve(b);
        weight[x]+=num;
        weight[y]+=num;
        mp[x][y]+=num;
        unionn(x,y);
    }
    set<int>st;
    for(int i=0;i<cnt;i++){
        int x=findth(i);
        st.insert(x);
    }
    vector<int>vec;
    for(auto it:st){
        if(sum[it]>2){
            vec.push_back(it);
        }
    }
    if(vec.size()==0){
        cout<<"0"<<endl;
        return 0;
    }
    vector<int>ve[N];
    for(int i=0;i<vec.size();i++){
        for(int j=0;j<cnt;j++){
            if(p[j]==vec[i]){
                ve[i].push_back(j);
            }
        }
    }
    int su=0;

    vector<int>pp;
    map<int,int>mm;
    vector<node>no;
    for(int i=0;i<vec.size();i++){
        vector<int>tt;
        for(int j=0;j<ve[i].size();j++){
            tt.push_back(ve[i][j]);
        }
        for(int z=0;z<tt.size();z++){
            for(int w=0;w<tt.size();w++){
                su+=mp[tt[z]][tt[w]];
            }
        }
        if(su>k){
            no.push_back(node(i,su));
        }
        su=0;
    }
    if(no.size()==0){
        cout<<"0"<<endl;
        return 0;
    }
    cout<<no.size()<<endl;
    for(int i=0;i<no.size();i++){
        int maxn=-1;
        int idd=0;
        for(int j=0;j<ve[no[i].id].size();j++){
            if(weight[ve[no[i].id][j]]>maxn){
                maxn=weight[ve[no[i].id][j]];
                idd=ve[no[i].id][j];
            }
        }
        gang[is[idd]]=sum[findth(idd)];
    }
    for(auto it:gang){
        cout<<it.first<<" "<<it.second<<endl;
    }
    return 0;
}

免责声明:文章转载自《1034 Head of a Gang (30 分)(图的遍历or并查集)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c# js 删除table原行数据传奇人物属性解释下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

TCP/IP协议学习(五) 基于C# Socket的C/S模型

TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的;然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多。C#通过提供的Socket API实现了对TCP/IP协议栈的封装,让实现C/S模型变得更加简单,对于入门TCP/IP协议学习十分有帮助。 Socket通讯实现参考标准的流程如图所示, · 服...

瀑布流的三种实现方式(原生js+jquery+css3)

前言 项目需求要弄个瀑布流的页面,用的是waterfall这个插件,感觉还是可以的,项目赶就没自己的动手写。最近闲来没事,就自己写个。大致思路理清楚,还是挺好实现的... 原生javascript版 <!DOCTYPE html> <html lang="en"> <head> <meta charset=...

java 调用apache.commons.codec的包简单实现MD5加密

转自:https://blog.csdn.net/mmd1234520/article/details/70210002/ 1 importjava.security.MessageDigest; 2 importjava.security.NoSuchAlgorithmException; 3 4 import org.apache....

数据基本类型以及相关举例

数据基本类型: 整型:字节型byte 短整型short  整型int  浮点类型:长整形long  浮点型  fioat   双精度性double  字符型:char  布尔型:boolean   引用类型( reference): 类class   接口interface   数据  array     循环:for   while      do wh...

通过尾递归避免栈溢出

JavaScript中的递归即函数内调用函数自身,但递归是非常耗内存的,每一次调用都会分配一定的栈空间,达到一定的数量(具体看浏览器)便会溢出报错。 function recursion (num) { if (num === 1) { return 1; } return num + recursion(--num...

SpringBoot+读取properties文件内容并注入到类属性中

第一种方法,以发送短信功能为例: 1.application.properties文件: sms.host=http://dingxin.market.alicloudapi.com sms.path=/dx/sendSms sms.method=POST sms.appcode=xxxxxxx 2.需要注入的类,在类的上面加上@Component,在类属...