题目链接: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 ",ic); 22 else 23 { 24 printf("Case #%d: Yes ",ic); 25 printf("%d ",sum); 26 for(int i=1;i<=n;i++) 27 { 28 for(int j=1;j<=dt[i].first;j++) 29 printf("%d %d ",dt[i].second,dt[j].second); 30 } 31 } 32 } 33 return 0; 34 }