hdu 5813 Elegant Construction

     水题

  题意:有n个城市,给你每个城市能到达城市的数量,要你构图,输出有向边,要求无环,输出任意的解

  例:

Sample Input

3
3
2 1 0
2
1 1
4
3 1 1 0
 
Sample Output
Case #1: Yes
2
1 2
2 3
Case #2: No
Case #3: Yes
4
1 2
1 3
2 4
3 4

  想法:不构成环,就是最终有一个边为零,所以至少有一城市能到达的城市数为零,所以可以逐层的连向零点的边,如果最后为都为零,表示构图成功,否则失败

  代码:

#include <iostream>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 110000
using namespace std;

struct node
{
    int v,i;

} a[1100];
bool cmp(node a,node b)
{
    return a.v<b.v;
}
int b[1000000+88][2];

int main()
{

    int t;
    cin>>t;
    int dd=0;
    while(t--)
    {

        int n;
        cin>>n;
        for(int i=1; i<=n; i++)
        {
            cin>>a[i].v;a[i].i=i;
        }
        sort(a+1,a+n+1,cmp);
        int ans=0;
        bool faa=true;
        for(int i=1; i<=n; i++)
        {
            if(a[i].v!=0)
            {
                printf("Case #%d: No\n",++dd);
                faa=false;
                break;
            }
            bool fa=true;
            for(int q=i; q<=n; q++)
            {
                if(a[q].v!=0)fa=false;
            }
            if(fa)
            {
                printf("Case #%d: Yes\n",++dd);
                break;
            }
            for(int q=i; q<=n; q++)
            {
                if(a[q].v!=0)
                {
                    b[ans][0]=a[q].i;
                    b[ans++][1]=a[i].i;
                    a[q].v--;
                }
            }
        }
        if(faa)
        {
            printf("%d\n",ans);
            for(int i=0; i<ans; i++)
            {
                printf("%d %d\n",b[i][0],b[i][1]);
            }
        }

    }

    return 0;
}
View Code

 

posted @ 2016-08-09 23:08  热风轻浮  阅读(99)  评论(0)    收藏  举报