2016多校联合训练#7
HDU 5813 Elegant Construction
水题
传送门:HDU
题意
图上有n个点,点之间有单向的路,告诉你每个点能到达的点的个数,让你构建一个图出来。建议读原题。
思路
排序,按到达点数量从小到大排,然后正向读点,每到一个点,往前连路,建图就行了。
代码
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <math.h>
#include <stack>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long ll;
const int MAXN=1007;
const double eps=1e-8;
const int oo=2000000007;
struct ppp{
int a,b;
ppp (){};
ppp (int _first,int _second)
{
a=_first;
b=_second;
}
bool operator <(const ppp &c) const
{
return a<c.a;
}
};
typedef struct ppp P;
int main()
{
int T;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
int n;
scanf("%d",&n);
P num[MAXN];
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
num[i]=P(temp,i+1);
}
sort(num,num+n);
printf("Case #%d: ",t);
bool flag=false;
for(int i=0;i<n;i++)
{
if(num[i].a>i)
{
printf("No\n");
flag=true;
break;
}
}
if(flag) continue;
printf("Yes\n");
vector<P> vec;
for(int i=0;i<n;i++)
{
int cnt=0;
for(int j=0;j<i;j++)
{
if(cnt==num[i].a) break;
cnt++;
vec.push_back(P(num[i].b,num[j].b));
}
}
printf("%d\n",vec.size());
for(int i=0;i<vec.size();i++)
{
printf("%d %d\n",vec[i].a,vec[i].b);
}
}
}