HDU 5813 Elegant Construction (构造有向图)

来源:互联网 发布:java中public的翻译 编辑:程序博客网 时间:2024/05/24 22:45

Elegant Construction

题目链接:点我打开链接


Author
SYSU
Source
2016 Multi-University Training Contest 7 



题意:要求构造一个有向图,使得点i能够到达Ai个点.
输出其中一个满足条件的图就可以。(special judge)。

题解:将顶点按能到达的点数从小到大排序,排好序之后每个点只能往前面的点连边. 因而如果存在一个排在第i位的点,要求到达的点数小于等于i-1,则可以按照上述方法构造出图;否则 NO . 复杂度O(N^2).

AC代码:

#include<bits/stdc++.h>#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<cstring>#include<vector>#include<map>#include<queue>#include<set>#include<stack>using namespace std;typedef long long ll;typedef unsigned long long ull;int read(){    int v = 0, f = 1;    char c =getchar();    while( c < 48 || 57 < c ){        if(c=='-') f = -1;        c = getchar();    }    while(48 <= c && c <= 57)         v = v*10+c-48, c = getchar();    return v*f;}struct Node{    int num,id;   }num[1005];;bool cmp(Node a,Node b){       return a.num<b.num;}int main(){    int t;    scanf("%d",&t);    for(int m=1;m<=t;m++)    {        int n;        scanf("%d",&n);        for(int j=1;j<=n;j++)        {            int temp;            scanf("%d",&temp);            num[j].id=j;            num[j].num=temp;        }        sort(num+1,num+1+n,cmp);        int flag=1;        for(int i=1;i<=n;i++)        {            if(num[i].num<=i-1) //排序后,一个排在第 i位的点,要求到达的点数小于等于i-1            {                continue;            }            else                flag=0;        }        if(flag==0)            printf("Case #%d: No\n",m);        else        {            printf("Case #%d: Yes\n",m);            int ans=0;            for(int i=1;i<=n;i++)                for(int j=1;j<=num[i].num;j++)                {                    ans++;                }            printf("%d\n",ans);            for(int i=1;i<=n;i++)                for(int j=1;j<=num[i].num;j++)                {                    printf("%d %d\n",num[i].id,num[j].id);                }        }    }    return 0;}


2 0
原创粉丝点击