605B. Lazy Student(codeforces Round 335)
2 seconds
256 megabytes
standard input
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.
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.
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.
4 5
2 1
3 1
4 0
1 1
5 0
2 4
1 4
3 4
3 1
3 2
3 3
1 0
2 1
3 1
-1
#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)的更多相关文章
- 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 ...
- Codeforces Round #335 (Div. 2) D. Lazy Student 贪心+构造
题目链接: http://codeforces.com/contest/606/problem/D D. Lazy Student time limit per test2 secondsmemory ...
- Codeforces Round #335 (Div. 2) D. Lazy Student 贪心
D. Lazy Student Student Vladislav came to his programming exam completely unprepared as usual. He ...
- CodeForces 605B Lazy Student
构造.对边的权值排序,权值一样的话,在MST中的边排到前面,否则权值小的排在前面. 然后边一条一条扫过去,如果是1 ,那么连一个点到集合中,如果是0,集合内的边相连. #include<cstd ...
- Codeforces Round #335 Sorting Railway Cars 动态规划
题目链接: http://www.codeforces.com/contest/606/problem/C 一道dp问题,我们可以考虑什么情况下移动,才能移动最少.很明显,除去需要移动的车,剩下的车, ...
- 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 ...
- 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 ...
- 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 ...
- 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/ ...
随机推荐
- ACM_百度的面试(单调栈)
百度的面试 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在一个二维平面,从左到右竖立n根高度分别为:a[1],a[2],... ...
- ORACLE SEQUENCE用法(转)
ORACLE SEQUENCE用法 在oracle中sequence就是序号,每次取的时候它会自动增加.sequence与表没有关系. 1.Create Sequence 首先要有CREATE ...
- SQL基本操作——JOIN多表联查
基本概念 join :用于根据两个或多个表中的列之间的关系,从这些表中查询数据. join和key:有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join.数据库中的表可 ...
- Redis系列(一)StackExchange.Redis的使用
Redis系列(一)StackExchange.Redis的使用 一.DLL安装 用NuGet搜索StackExchange.Redis,然后下载就可以. ConnectionMultiplexer对 ...
- JSON数据 与 JSON数据的使用
https://blog.csdn.net/u010378878/article/details/52943792 https://blog.csdn.net/liuxuan12417/article ...
- Win32中 DLL、Lib 库的创建机器使用
Windows 下 的静态库和动态库 一.静态函数库(Lib) 1. 静态函数库的制作(C/C++) —— 打开新建项目,然后选中Win32项目,接着在创建项目中选择 Lib,再接着将函数.实现功能的 ...
- 20.混合使用match和近似匹配实现召回率与精准度的平衡
主要知识点: 召回率的慨念 精准度的慨念 match和近似匹配混合使用方法 召回率(recall):比如你搜索一个java spark,总共有100个doc,能返回多少个doc作为结果 ...
- Python基础-判断闰年
输入一个年份,判断该年份是否是闰年并输出结果.求它是否是闰年?要求:能被4整除不能被100整除或者能被400整除. y=input('请输入年份:') if(y%4==0 and y%100 != 0 ...
- hdu 5652
India and China Origins Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- 3.1 一个简单的Java应用程序
如下一个最简单的应用程序,它将只发送一条消息到控制台窗口中: package myjavapp; public class FirstSample { public stati ...