【codechef】Computer Network(脑洞题)
2015-12-27 16:41
162 查看
题目描述
你的一门课的大作业要求你为学校机房设计一个计算机网络。
机房一共有 N 台计算机,而你一共需要建设 M 条链接,每条链接连接两台计算机。同时,网络还需要满足三个条件。
第一个条件是,网络中的每两台计算机都必须直接或者间接地相连。
可能会有人恶意攻击这个网络,因此第二个条件是,如果网络中任意一台机器因为一些原因而无法连接(即断开了与其他所有计算机的链接),剩余的计算机也应当能两两互连。换言之,对于网络中计算机的任意大小为 (N − 1) 的子集,第一个条件都应当成立。
第三个条件是,网络中不应有多余的链接。如果将一条链接移除后,上面的两个条件仍然满足,那么我们称这条链接是多余的。
给定 N 和 M,请构造一个满足上面三个条件的有 N 台计算机和 M 条链接的网络,或者指出问题无解。
输入格式
输入数据的第一行包含一个整数 T,代表数据组数。接下来是 T 组数据。每组数据仅有一行,包含两个整数 N 和 M,分别代表计算机和链接的数量。
输出格式
对于每组数据,如果问题无解,输出一行-1 -1。否则,输出 M 行,每行包含两个整数,代表一条链接所连接的两台计算机的编号。由于有第三个条件的存在,不允许出现重复的链接以及连向自身的链接。
好好感受一下这两幅图。。。明明已经发现了题目给的隐含条件(sub1:1<=n<=4,肯定<=4和>4是两种做法),然后画很久也画出点什么了(在图形内部画点可以增加总的边数,并且在图形内部画边必须至少隔两条外边,并且内部边不能相交),然而脑子却无法转弯,下意识觉得一定要把内边接在两个不同的外点。。。好惨啊就在AC边缘(泪
你的一门课的大作业要求你为学校机房设计一个计算机网络。
机房一共有 N 台计算机,而你一共需要建设 M 条链接,每条链接连接两台计算机。同时,网络还需要满足三个条件。
第一个条件是,网络中的每两台计算机都必须直接或者间接地相连。
可能会有人恶意攻击这个网络,因此第二个条件是,如果网络中任意一台机器因为一些原因而无法连接(即断开了与其他所有计算机的链接),剩余的计算机也应当能两两互连。换言之,对于网络中计算机的任意大小为 (N − 1) 的子集,第一个条件都应当成立。
第三个条件是,网络中不应有多余的链接。如果将一条链接移除后,上面的两个条件仍然满足,那么我们称这条链接是多余的。
给定 N 和 M,请构造一个满足上面三个条件的有 N 台计算机和 M 条链接的网络,或者指出问题无解。
输入格式
输入数据的第一行包含一个整数 T,代表数据组数。接下来是 T 组数据。每组数据仅有一行,包含两个整数 N 和 M,分别代表计算机和链接的数量。
输出格式
对于每组数据,如果问题无解,输出一行-1 -1。否则,输出 M 行,每行包含两个整数,代表一条链接所连接的两台计算机的编号。由于有第三个条件的存在,不允许出现重复的链接以及连向自身的链接。
好好感受一下这两幅图。。。明明已经发现了题目给的隐含条件(sub1:1<=n<=4,肯定<=4和>4是两种做法),然后画很久也画出点什么了(在图形内部画点可以增加总的边数,并且在图形内部画边必须至少隔两条外边,并且内部边不能相交),然而脑子却无法转弯,下意识觉得一定要把内边接在两个不同的外点。。。好惨啊就在AC边缘(泪
#include<iostream> #include<algorithm> #include<string> #include<map>//ll dx[4]={0,0,-1,1};ll dy[4]={-1,1,0,0}; #include<set>// #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #define ll long long #define lowbit(x) (x) & (-x) using namespace std; map<char,int> r[27]; int main(){ int t; cin>>t; while(t--){ int n,m; cin>>n>>m; if(n<=4){ if(m!=n){ cout<<"-1 -1"<<endl; continue; } for(int i=1;i<=n;++i){ if(i!=n) cout<<i<<" "<<i+1<<endl; else cout<<n<<" "<<1<<endl; } } else{ if(2*(n-4)+4<m||m<n){ cout<<"-1 -1"<<endl; continue; } //q+2*p=m q+p=n int p=m-n,q=n-p; for(int i=1;i<=q;++i){ if(i!=q) cout<<i<<" "<<i+1<<endl; else cout<<q<<" "<<1<<endl; } for(int i=q+1;i<=n;++i){ cout<<1<<" "<<i<<endl; cout<<3<<" "<<i<<endl; } } } return 0; }
相关文章推荐
- Hibernate教程04——类继承(子类、父类链接表)
- Hadoop IO 特性详解(2)
- Eclipse下搭建C/C++开发环境
- uva 10340 - All in All
- java单元测试junit测试线程问题
- Linux网络编程之TCP协议(基础班)
- AsyncTask源码解析
- Android中MediaButtonReceiver广播监听器的机制分析
- java实现的选择排序、冒泡排序、二分查找
- Ubuntu 14.04中文输入法的安装
- 23种设计模式(14)_行为型_命令模式(Command Pattern)
- 非常全的linux面试笔试题及参考答案
- 24.利用UITableView制作一个的动态的个人信息列表
- bzoj2761 [JLOI2011]不重复数字
- html--9(IE版本测试工具及开发工具)
- 初步掌握HDFS的架构及原理3
- JavaScript 使用Document记录cookie
- Scanner类的.next()和.hashNext()方法
- USACO Humble Numbers
- Matlab生成视频文件