Codeforces 404C Restore Graph 构造

来源:互联网 发布:怎么添加usb端口 编辑:程序博客网 时间:2024/05/16 01:41

点击打开链接

题意:给出n个点的最短距离数组d[i],每个顶点的度数<=K,构造出满足条件的图,输出边
先将距离d[i]排序,从小到大构造边 保存最短距离为x-1的点pre,把距离为x的连接到x-1上,每个pre[i]最多连接k次,更新pre即可 复杂度O(M)==1e6

#include <bits/stdc++.h>using namespace std;typedef pair<int,int> ii;const int N=2e5+20;struct node{int id,x;}d[N];bool cmp(node a,node b){return a.x<b.x;} int n,K;vector<ii> ans;//u-vvector<ii> pre,now;// 距离为k-1的点,使用次数 int main(){while(cin>>n>>K){int u=-1;bool flag=true;for(int i=1;i<=n;i++)scanf("%d",&d[i].x),d[i].id=i; sort(d+1,d+1+n,cmp);for(int i=1;i<=n;i++){if(d[i].x==0){if(u==-1)u=i;elseflag=false;}}if(u==-1||flag==false){puts("-1");continue;}ans.clear(),pre.clear(),now.clear();int i=2,j;pre.push_back(ii(u,K));for(int k=1;k<n;k++)//最短距离为k时 {if(pre.empty()&&i<=n){flag=false;break;}j=0;//while(i<=n&&d[i].x==k){ if(pre[j].second==0)j++;if(j==pre.size()){flag=false;break;}pre[j].second--;ans.push_back(ii(pre[j].first,i));now.push_back(ii(i,K-1));i++;}pre.clear();pre=now;now.clear();}if(flag==false){puts("-1");continue;}cout<<ans.size()<<endl;for(int i=0;i<ans.size();i++)cout<<d[ans[i].first].id<<' '<<d[ans[i].second].id<<endl;}return 0;}


0 0