码迷,mamicode.com
首页 > 其他好文 > 详细

hdu_5813_Elegant Construction(xjb搞)

时间:2016-08-09 19:04:41      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:hdu_5813_Elegant Construction

题意:

给你n个点,每个点要可以到达ai个点,可以直接可以间接,不能有环,问是否可行,如果可行就任选一种方式连接,并输出连接的边数和边

题解:

我们按每个点要能到达的点数从小到大排序,然后枚举每个点i,对前面的j(j<i)连一条边,这样保证能到达ai个点,如果第i个点大于等于i,那么肯定没有方案,此时不能向后面的点连边,如果连了就成环了。

技术分享
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int,int>P;
 4 int t,n,x,y;
 5 P dt[1011];
 6 int main()
 7 {
 8     int t;scanf("%d",&t);
 9     for(int ic=1;ic<=t;ic++)
10     {
11         scanf("%d",&n);
12         int sum=0;
13         for(int i=1;i<=n;i++)
14         {
15             scanf("%d",&x),sum+=x;
16             dt[i].first=x,dt[i].second=i;
17         }
18         sort(dt+1,dt+1+n);
19         int fg=0;
20         for(int i=1;i<=n;i++)if(dt[i].first>=i){fg=1;break;}
21         if(fg)printf("Case #%d: No\n",ic);
22         else
23         {
24             printf("Case #%d: Yes\n",ic);
25             printf("%d\n",sum);
26             for(int i=1;i<=n;i++)
27             {
28                 for(int j=1;j<=dt[i].first;j++)
29                 printf("%d %d\n",dt[i].second,dt[j].second);
30             }
31         }
32     }
33     return 0;
34 }
View Code

 

hdu_5813_Elegant Construction(xjb搞)

标签:

原文地址:http://www.cnblogs.com/bin-gege/p/5754249.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!