hdu5813

来源:互联网 发布:安卓手机运行java程序 编辑:程序博客网 时间:2024/05/18 18:02

题意:给n个点,构建有向图,使从每个点出发能到达的点恰好为为cnt

思路:把cnt从小到大排序,对于每个点,若排在其之前的点数目>=cnt,则能构建成功。然后从第一个开始与i连接就好。

一开始理解错了,以为必须要构建最小边数

#include <iostream>  #include <cstdio>  #include <cstring>  #include <cmath>  #include <algorithm>  #include <stack>#include <queue>  #include <map>  #include <set>  #include <vector>  #define LL long long  #define eps 1e-8  #define maxn 150  #define mod 110119  #define inf 0x3f3f3f3f  #define IN freopen("in.txt","r",stdin);  using namespace std; struct node{int num;int cnt;}E[1005];bool cmp(struct node a,struct node b){return a.cnt<b.cnt; }int main(){//IN;int t;cin>>t;int ca=1;while(t--){printf("Case #%d: ",ca++);int n;int sum=0;scanf("%d",&n);for(int i=0;i<n;i++){E[i].num=i;scanf("%d",&E[i].cnt);sum+=E[i].cnt;}sort(E,E+n,cmp);int sign=0;for(int i=0;i<n;i++){if(E[i].cnt>i){sign=1;break;}}if(sign==1){printf("No\n");continue;}printf("Yes\n%d\n",sum);for(int i=0;i<n;i++){for(int j=0;j<E[i].cnt;j++){printf("%d %d\n",E[i].num+1,E[j].num+1);}}}return 0;}


0 0
原创粉丝点击