Codeforces404C【构造】

来源:互联网 发布:移民新西兰 知乎 编辑:程序博客网 时间:2024/05/21 06:35

题意:

一个图有n个点,每一个点最多连接k条直线,给出多有起点到终点的距离,没有环,不能输出重边,输出所有有连接的单向边

思路:
就是简单想…不知道怎么说了,画个图,我们建边,那么距离是 i 就是连距离 i - 1的,我是记录了一下 i -1 的位置,防止小T。。。随便搞吧。。

#include <iostream>#include <cstdio>#include <string.h>#include <algorithm>using namespace std;typedef __int64 LL;const int N=1e5+10;struct asd{    int id;    int c;    int num;};asd q[N];int sta[N];int pos[N];int xx[N*10],yy[N*10];int k,n;bool cmp(asd x,asd y){    return x.num<y.num;}void make_pos(){    int ss=-1;    for(int i=1;i<=n;i++)    {        if(q[i].num>=ss)        {            ss=q[i].num;            pos[ss]=i;        }    }}int main(){    scanf("%d%d",&n,&k);    memset(sta,0,sizeof(sta));    for(int i=1;i<=n;i++)    {        scanf("%d",&q[i].num);        sta[q[i].num]++;        q[i].c=0;        q[i].id=i;    }    sort(q+1,q+n+1,cmp);    if(sta[0]!=1)    {        puts("-1");        return 0;    }    make_pos();    int cnt=0;    for(int i=2;i<=n;i++)    {        if(sta[q[i].num-1])        {            for(int j=pos[q[i].num-1];j>=1;j--)            {                if(q[j].num==q[i].num-1&&q[j].c<k)                {                    xx[cnt]=q[j].id;                    yy[cnt++]=q[i].id;                    q[j].c++;                    q[i].c++;                    if(q[i].c==k)                        sta[q[i].num]--;                    if(q[j].c==k)                    {                        sta[q[j].num]--;                        pos[q[j].num]=j-1;                    }                    break;                }            }        }        else        {            puts("-1");            return 0;        }    }    printf("%d\n",cnt);    for(int i=0;i<cnt;i++)        printf("%d %d\n",xx[i],yy[i]);    return 0;}
0 0
原创粉丝点击