• Codeforces 1082D Maximum Diameter Graph (贪心构造)


    <题目链接>

    题目大意:
    给你一些点的最大度数,让你构造一张图,使得该图的直径最长,输出对应直径以及所有的边。

    解题分析:
    一道比较暴力的构造题,首先,我们贪心的想,要使图的直径最长,肯定是尽可能的将所有的顶点连在同一条链上,并且,所有度数为1的点都只能作为最外围的点。所以,基本思想就是先将两个度为1的顶点放在链的两端(如果有的话),然后所有度>=2的点放在链的中间,建好链之后,再将多余的度为1的点挂在链上最大度数未满的点上。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 505;
    int n,ind[N];
    struct Node{
        int ind,loc;
        bool operator < (const Node &tmp){
            return ind>tmp.ind;
        }
    };
    vector<Node>vec1,vec;
    
    int main(){
        scanf("%d",&n);
        
        for(int i=1;i<=n;i++){
            int numd;scanf("%d",&numd);
            if(numd==1)vec1.push_back(Node{numd,i});
            if(numd>1)vec.push_back(Node{numd,i});
        }
        if(vec1.size()<=2){
            if(vec1.size()==0){
                printf("YES %d
    ",vec.size()-1);
                printf("%d
    ",vec.size()-1);
                int u=vec[0].loc;
                for(int i=1;i<vec.size();i++){
                    int v=vec[i].loc;printf("%d %d
    ",u,v);
                    u=v;
                }
            }else {
                if(vec1.size()==1){
                    printf("YES %d
    ",vec.size());
                    printf("%d
    ",vec.size());
                    int u=vec1[0].loc;
                    for(int i=0;i<vec.size();i++){
                        int v=vec[i].loc;printf("%d %d
    ",u,v);
                        u=v;
                    }
                }else if(vec1.size()==2){
                    printf("YES %d
    ",vec.size()+1);
                    printf("%d
    ",vec.size()+1);
                    int u=vec1[0].loc;
                    for(int i=0;i<vec.size();i++){
                        int v=vec[i].loc;printf("%d %d
    ",u,v);
                        u=v;
                    }
                    printf("%d %d
    ",vec[vec.size()-1].loc,vec1[1].loc);
                }
            }
        }else {     //如果度为1的点多于2个
            int sum=0;
            for(int i=0;i<vec.size();i++){
                vec[i].ind-=2;
                sum+=vec[i].ind;
            }
            if(sum<vec1.size()-2)return puts("NO"),0;
            printf("YES %d
    ",vec.size()+1);
            printf("%d
    ",vec.size()+1+vec1.size()-2);
            int u=vec1[0].loc;
            for(int i=0;i<vec.size();i++){
                int v=vec[i].loc;printf("%d %d
    ",u,v);
                u=v;
            }
            printf("%d %d
    ",vec[vec.size()-1].loc,vec1[1].loc);
            sort(vec.begin(),vec.end());
            int pos=0;
            for(int i=2;i<vec1.size();i++){
                vec[pos].ind--;
                printf("%d %d
    ",vec1[i].loc,vec[pos].loc);
                if(vec[pos].ind==0)pos++;
            }
        }
    }
  • 相关阅读:
    国内大学毕业论文LaTeX模板集合
    LATEX论文排版学习资源汇总
    论文神器Latex30分钟快速入门教程-只需9步向学神看齐
    smartdraw2013破解方法
    科研常用的软件
    推荐科研软件
    斯坦福大学科研软件
    【LaTeX】E喵的LaTeX新手入门教程(6)中文
    【LaTeX】E喵的LaTeX新手入门教程(5)参考文献、文档组织
    【LaTeX】E喵的LaTeX新手入门教程(4)图表
  • 原文地址:https://www.cnblogs.com/00isok/p/10522323.html
Copyright © 2020-2023  润新知