B. Lazy Student
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Student Vladislav came to his programming exam completely unprepared as usual. He got a question about some strange algorithm on a graph — something that will definitely never be useful in real life. He asked a girl sitting next to him to lend him some cheat
papers for this questions and found there the following definition:

The minimum spanning tree T of graph G is
such a tree that it contains all the vertices of the original graph G, and the sum of the weights of its edges is the minimum possible
among all such trees.

Vladislav drew a graph with n vertices and m edges
containing no loops and multiple edges. He found one of its minimum spanning trees and then wrote for each edge its weight and whether it is included in the found tree or not. Unfortunately, the piece of paper where the graph was painted is gone and the teacher
is getting very angry and demands to see the original graph. Help Vladislav come up with a graph so that the information about the minimum spanning tree remains correct.

Input

The first line of the input contains two integers n and m () —
the number of vertices and the number of edges in the graph.

Each of the next m lines describes an edge of the graph and consists of two integers aj and bj (1 ≤ aj ≤ 109, bj = {0, 1}).
The first of these numbers is the weight of the edge and the second number is equal to 1 if this edge was included in the minimum spanning
tree found by Vladislav, or 0 if it was not.

It is guaranteed that exactly n - 1 number {bj} are
equal to one and exactly m - n + 1 of them are equal to zero.

Output

If Vladislav has made a mistake and such graph doesn't exist, print  - 1.

Otherwise print m lines. On the j-th
line print a pair of vertices (uj, vj) (1 ≤ uj, vj ≤ n, uj ≠ vj),
that should be connected by the j-th edge. The edges are numbered in the same order as in the input. The graph, determined by these
edges, must be connected, contain no loops or multiple edges and its edges with bj = 1 must
define the minimum spanning tree. In case there are multiple possible solutions, print any of them.

Sample test(s)
input
4 5
2 1
3 1
4 0
1 1
5 0
output
2 4
1 4
3 4
3 1
3 2
input
3 3
1 0
2 1
3 1
output
-1


题目大意:
    一张图,n个顶点m条边,仅仅给出它们的权重和是否是最小生成树的边,恢复原来的顶点的连接关系。

解题思路:
    构造题,把最小生成树当成长度为n的链。且是从小到大排序的,于是后面的不是最小生成树的边的两点就仅仅能在在当前这个这个顶点的前面。注意不要有重边。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100000+100;
struct node
{
int x,y,id,v,sign;
}a[maxn];
int cnt[maxn];
bool cmp1(node x1,node y1)
{
if(x1.v==y1.v)
return x1.sign>y1.sign;
return x1.v<y1.v;
}
bool cmp2(node x1,node y1)
{
return x1.id<y1.id;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=0; i<m; i++)
{
scanf("%d%d",&a[i].v,&a[i].sign);
a[i].id=i;
}
sort(a,a+m,cmp1);
int flag=1;
if(a[0].sign==0)
{
printf("-1\n");
}
else
{
int now=2;//当前要处理的顶点
int cur=3;//不是最小生成树加入到的顶点
cnt[cur]=1;
for(int i=0; i<m; i++)
{
if(a[i].sign)
{
a[i].x=now;
a[i].y=now-1;
now++;
//cur=1;
}
else
{
if(cur<=now-1)
{
a[i].x=cur;
a[i].y=cnt[cur];
// cout<<cur<<" "<<cnt[cur]<<endl;
if(cnt[cur]>=cur-2)//cur与cur+1的边是给最小生成树的
{
cur++;
cnt[cur]=1;
}
else
{
cnt[cur]++;
}
}
else
{
flag=0;
break;
}
}
}
if(flag)
{
sort(a,a+m,cmp2);
for(int i=0; i<m; i++)
{
printf("%d %d\n",a[i].x,a[i].y);
}
}
else
printf("-1\n");
} }
return 0;
}

605B. Lazy Student(codeforces Round 335)的更多相关文章

  1. Codeforces Round #335 (Div. 2) D. Lazy Student 构造

    D. Lazy Student Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/606/probl ...

  2. Codeforces Round #335 (Div. 2) D. Lazy Student 贪心+构造

    题目链接: http://codeforces.com/contest/606/problem/D D. Lazy Student time limit per test2 secondsmemory ...

  3. Codeforces Round #335 (Div. 2) D. Lazy Student 贪心

    D. Lazy Student   Student Vladislav came to his programming exam completely unprepared as usual. He ...

  4. CodeForces 605B Lazy Student

    构造.对边的权值排序,权值一样的话,在MST中的边排到前面,否则权值小的排在前面. 然后边一条一条扫过去,如果是1 ,那么连一个点到集合中,如果是0,集合内的边相连. #include<cstd ...

  5. Codeforces Round #335 Sorting Railway Cars 动态规划

    题目链接: http://www.codeforces.com/contest/606/problem/C 一道dp问题,我们可以考虑什么情况下移动,才能移动最少.很明显,除去需要移动的车,剩下的车, ...

  6. Codeforces Round #335 (Div. 2) B. Testing Robots 水题

    B. Testing Robots Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/contest/606 ...

  7. Codeforces Round #335 (Div. 1) C. Freelancer's Dreams 计算几何

    C. Freelancer's Dreams Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/contes ...

  8. Codeforces Round #335 (Div. 2) C. Sorting Railway Cars 动态规划

    C. Sorting Railway Cars Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/conte ...

  9. Codeforces Round #335 (Div. 2) A. Magic Spheres 水题

    A. Magic Spheres Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/contest/606/ ...

随机推荐

  1. 题解报告:hdu 1028 Ignatius and the Princess III(母函数or计数DP)

    Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...

  2. 363 Max Sum of Rectangle No Larger Than K 最大矩阵和不超过K

    Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...

  3. scala函数用法

    直接上代码. package com.test.scala.test object Function { def main(args: Array[String]): Unit = { println ...

  4. Android ScrollView里嵌套RecyclerView时,在RecyclerView上滑动时出现卡顿(冲突)的现象

    最近在项目中遇到一个现象,一个界面有一个RecyclerView(GridView型的),外面套了一层ScrollView,通过ScrollView上下滚动,但是在滑动的时候如果是在RecyclerV ...

  5. 查看APK包名签名等信息

    有些游戏第三方比如分享需要配置游戏包名和签名,不同渠道包名签名又不同,所以时常需要查看不同apk包等签名信息,之前是使用等微博开放平台的手机客户端查看apk签名,前提是知道包名,网上找了下查看签名和包 ...

  6. 安卓设置AttributeSet

    XmlPullParser parser = getResources().getXml(R.layout.textview);    AttributeSet attributes = Xml.as ...

  7. VMware或者KVM克隆的虚拟机网卡无法启动

    在VMware里克隆出来的CentOS Linux.. ifconfig...没有看到eth0..然后重启网卡又报下面错误. 故障现象: service network restartShutting ...

  8. Navicat 连接docker mysql报错

    解决办法: docker exec -it dc10e8b328d7 bashmysql -u root -p 输入密码 use mysql; ALTER USER 'root'@'%' IDENTI ...

  9. Uedior上传大文件超时报错

    出错原因: 1.php超时等待时间太短 2.uedior中设置了请求超时,提示信息: 上传失败,请重试 先解决第一个问题: 设置php.ini中的max_execution_time 为0 (意思是h ...

  10. AtCoder Beginner Contest 089完整题解

    A - Grouping 2 Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement There a ...