hdu_5813_Elegant Construction(xjb搞)

题目链接: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

 

posted @ 2016-08-09 18:22  bin_gege  阅读(187)  评论(0编辑  收藏  举报