zoukankan      html  css  js  c++  java
  • 1034 Head of a Gang (30分) 连通图判断

    题目

    https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624

    题意

    给你一个有向图
    找出连通图,按条件输出

    Sample Input 1:

    8 59
    AAA BBB 10
    BBB AAA 20
    AAA CCC 40
    DDD EEE 5
    EEE DDD 70
    FFF GGG 30
    GGG HHH 20
    HHH FFF 10

    Sample Output 1:

    2
    AAA 3
    GGG 3

    思路

    比较简单,就是细心读题

    1. 节点数cnt>2
    2. 总权sum<K
    3. head是与他相连的边权总和最大的那个点out_max
    4. 结果排序输出ss

    code(写的有点乱)

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    map<string,int>id;
    map<int,string>st;
    struct edge{
        int time;
        int v;
        edge(int x,int y):time(x),v(y){}
    };
    vector<edge>G[10006];//有向图,便于求sum[]
    vector<edge>G1[10006];//无向图,方便求联通
    
    int vis[10006];//访问标记
    int flag=0;
    int cnt[10006];//计数,每个帮派人数
    int sum[10006];//帮派总权重
    void DFS(int x)
    {
        if(vis[x]) return ;
        vis[x]=flag;
        cnt[flag]++;
        for(int i=0;i<G1[x].size();++i) DFS(G1[x][i].v);
    }
    
    struct an{
        string s;
        int n;
    }temp;
    vector<an>ss;
    bool cmp(an x,an y) {return x.s<y.s;}
    int main()
    {
        int N,K; cin>>N>>K;
        int num=0;
        for(int i=0;i<N;++i)
        {
            string a,b; int c;
            cin>>a>>b>>c;
            if(id[a]==0) id[a]=(++num),st[num]=a;
            if(id[b]==0) id[b]=(++num),st[num]=b;
            G[id[a]].push_back(edge(c,id[b]));
    
            G1[id[a]].push_back(edge(c,id[b]));
            G1[id[b]].push_back(edge(c,id[a]));
        }
        for(int i=1;i<=num;++i)
        {
            if(vis[i]==0) {
                flag++;
                DFS(i);
            }
        }
        for(int i=1;i<=num;++i)
        {
            for(int j=0;j<G[i].size();++j)
            {
                sum[vis[i]]+=G[i][j].time;
            }
        }
        int ans=0;
        for(int i=1;i<=flag;++i)
        {
            if(cnt[i]>2 && sum[i]>K)
            {
                ans++;
            }
        }
        cout<<ans<<endl;
        for(int i=1;i<=flag;++i)
        {
            if(cnt[i]>2 && sum[i]>K)
            {
                int max_out=0,max_id=0;
                for(int j=1;j<=num;++j)
                {
                    if(vis[j]==i)
                    {
                        int out=0;
                        for(int k=0;k<G1[j].size();++k)
                        {
                            out+=G1[j][k].time;
                        }
                        if(out>max_out)
                        {
                            max_out=out;
                            max_id=j;
                        }
                    }
                }
                temp.s=st[max_id];
                temp.n=cnt[i];
                ss.push_back(temp);
            }
        }
        sort(ss.begin(),ss.end(),cmp);
        for(int i=0;i<ss.size();++i)
        {
            cout<<ss[i].s<<" "<<ss[i].n<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    Python中文乱码(转)
    一千行MySQL学习笔记
    pycharm在同目录下import,pycharm会提示错误,但是可以运行
    PyCharm3.0默认快捷键
    Sublime Text 3 快捷键
    window下spyder的快捷键
    Anaconda更新和第三方包更新
    PyCharm 教程
    centos7.9 源码编译安装php
    centos7.9 源码编译安装nginx
  • 原文地址:https://www.cnblogs.com/liuyongliu/p/13553996.html
Copyright © 2011-2022 走看看