题意:在一张有向图中,给你每个点有多少个出度,问不形成环的情况下,怎样连边。
思路:将这些点按度排个序,然后每个点,从第一个点开始连就好了,每次都连前面的边,这样能保证不会出现重点。
#include<bits/stdc++.h>
using namespace std;
struct NODE {
int v,num;
}a[1111];
bool cmp(const NODE X,const NODE Y) {
if(X.v==Y.v) return X.num<Y.num;
return X.v<Y.v;
}
int main()
{
int t,n;
int kase=0;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i].v);
a[i].num=i;
}
sort(a+1,a+n+1,cmp);
int ans=0;
int fa=1;
for(int i=1;i<=n;i++) {
if(a[i].v>=i) {
fa=0;
break;
}
ans+=a[i].v;
}
if(fa==0) {
printf("Case #%d: No\n",++kase);
continue;
}
printf("Case #%d: Yes\n",++kase);
printf("%d\n",ans);
for(int i=2;i<=n;i++) {
for(int j=1;j<=a[i].v;j++) {
printf("%d %d\n",a[i].num,a[j].num);
}
}
}
return 0;
}