D. Maximum Diameter Graph 贪心+图论+模拟

题意:给出n个点的度数列 上限(实际点可以小于该度数列)问可以构造简单路最大长度是多少(n个点要连通 不能有平行边、重边)

思路:直接构造一条长链  先把度数为1的点 和度数大于1的点分开  先把度数大于1的点连在一起 然后把度数为1的点连在两边可以涨最多2的长度(如果有大于等于2的度数为1的点)

随后就涨不了长度了,还要把度数为1的点接在链上 判断是否可以构成这样一颗树

(在while里面少写了度数-- WA了两次7 QAQ)

 1 #include<bits/stdc++.h>
 2 #define pb push_back 
 3 #define pii pair<int,int>
 4 #define mkp make_pair
 5 #define S second
 6 #define F first
 7 using namespace std;
 8 const int maxn=2e5+6;
 9 const int inf =0x3f3f3f3f;
10 vector<pii>v;
11 vector<int>v1;
12 int vis[maxn];
13 pii ans[maxn];
14 int main(){
15     int n;
16     scanf("%d",&n);
17     int tmp;
18     for(int i=1;i<=n;i++){
19         scanf("%d",&tmp);
20         if(tmp==1)v1.pb(i);
21         else {
22             v.pb(mkp(tmp,i));
23         }
24     }
25     if(n==2){
26         cout<<"YES "<<2<<endl;
27         cout<<1<<endl;
28         cout<<1<<" "<<2<<endl;
29         return 0;
30     }
31     //cout<<v.size()<<endl;
32     int cnt=0;
33     int len=0;
34     sort(v.begin(),v.end());
35     for(int i=0;i<int(v.size())-1;i++){
36         ans[cnt++]=mkp(v[i].S,v[i+1].S);
37         v[i].F--;
38         v[i+1].F--;
39         len++;
40     }
41     if(v1.size()>=2){
42         int p=2;
43         len+=2;
44         if(v.size()&&v[0].F){
45         v[0].F--;
46         ans[cnt++]=mkp(v[0].S,v1[0]);
47         }
48         
49         if(v.size()&&v[int(v.size())-1>=0?v.size()-1:0].F){
50             v[int(v.size())-1>=0?v.size()-1:0].F--;
51             ans[cnt++]=mkp(v[int(v.size())-1>=0?v.size()-1:0].S,v1[1]);
52         }
53     //    ans[cnt++]=mkp(v[0].S,v1[0]);
54         
55         for(int i=0;i<int(v.size());i++){
56             while(p<v1.size()&&v[i].F>0){
57                 ans[cnt++]=mkp(v[i].S,v1[p]);
58                 p++;
59                 v[i].F--;
60             }
61             if(p==v1.size())break;
62         }
63     }
64     else {
65 
66         if(v1.size()==1){
67             len+=1;
68             ans[cnt++]=mkp(v1[0],v[0].S);
69         }
70     }
71     //cout<<cnt<<endl;
72     if(cnt!=n-1){
73         cout<<"NO\n";
74         return 0;
75     }
76     cout<<"YES ";cout<<len<<endl;
77     cout<<cnt<<endl;
78     for(int i=0;i<cnt;i++){
79         cout<<ans[i].F<<" "<<ans[i].S<<endl;
80     }
81     return 0;    
82 }
View Code

 

全部评论

相关推荐

序&nbsp;朋友们,好久不见。&nbsp;笔者在过去消失的五个月里被困在情绪牢笼中过的相当煎熬,一度丢失自己,觉得整个世界都是昏暗的。&nbsp;庆幸的是靠着自己纯硬扛也是走出来了。表达欲再度回归,所以真的很开心还有机会能在再和大家见面。&nbsp;破碎秋招&nbsp;抑郁情绪的引爆点必然是秋招期间遭受的打击了,从去年九月份腾讯转正被告知失败之后就开始疯狂投递简历,每天都在经历:简历挂、一面挂、二面挂、三面挂、HR面挂,每天睁开眼就被无所适从的挫败感包围。&nbsp;秋招的特点是即便流程走到最后一步也不一定会&nbsp;offer,因为还需要进入大池子进行横向对比,俗称泡池子,而这一泡我的大多数面试流程到后面就没了后文,这一度让我感觉非常绝望。我深知自己学历并...
SoNiC_X:我已经工作快2年了,当时高考没考好没去到想去的学校,觉得天要塌了;校招找不到工作,觉得天要塌了;现在工作觉得看不到未来,觉得天要塌了;最近最大的感悟就是:天会一直塌,但是生活也会一直继续下去,还是要调整好自己的心态,不要因为一时的困难把自己困住,要记住完蛋的日子永远在后头
点赞 评论 收藏
分享
牛客963010790号:一般是hr拿着老板账号在招人不是真是老板招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务