ZOJ 3204 Connect them(最小生成树+最小字典序)
Connect them
Time Limit: 1 Second Memory Limit: 32768 KB
You have n computers numbered from 1 to n and you want to connect them to make a small local area network (LAN). All connections are two-way (that is connecting computers iand j is the same as connecting computers j and i). The cost of connecting computer i and computer j is cij. You cannot connect some pairs of computers due to some particular reasons. You want to connect them so that every computer connects to any other one directly or indirectly and you also want to pay as little as possible.
Given n and each cij , find the cheapest way to connect computers.
Input
There are multiple test cases. The first line of input contains an integer T (T <= 100), indicating the number of test cases. Then T test cases follow.
The first line of each test case contains an integer n (1 < n <= 100). Then n lines follow, each of which contains n integers separated by a space. The j-th integer of the i-th line in these n lines is cij, indicating the cost of connecting computers i and j (cij = 0 means that you cannot connect them). 0 <= cij <= 60000, cij = cji, cii = 0, 1 <= i, j <= n.
Output
For each test case, if you can connect the computers together, output the method in in the following fomat:
i1 j1 i1 j1 ......
where ik ik (k >= 1) are the identification numbers of the two computers to be connected. All the integers must be separated by a space and there must be no extra space at the end of the line. If there are multiple solutions, output the lexicographically smallest one (see hints for the definition of "lexicography small") If you cannot connect them, just output "-1" in the line.
Sample Input
2
3
0 2 3
2 0 5
3 5 0
2
0 0
0 0
Sample Output
1 2 1 3
-1
Hints:
A solution A is a line of p integers: a1, a2, ...ap.
Another solution B different from A is a line of q integers: b1, b2, ...bq.
A is lexicographically smaller than B if and only if:
(1) there exists a positive integer r (r <= p, r <= q) such that ai = bi for all 0 < i < r and ar < br
OR
(2) p < q and ai = bi for all 0 < i <= p
Author: CAO, Peng
Source: The 6th Zhejiang Provincial Collegiate Programming Contest
#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
int t,n;
int team[];
bool flag;
struct node
{
int x,y,cost;
node(int a,int b,int c){x=a;y=b;cost=c;}
};
struct cmp
{
bool operator()(node a,node b)
{
if (a.cost!=b.cost) return a.cost>b.cost;
else if (a.x!=b.x) return a.x>b.x;
else return a.y>b.y;
}//wa了一发,原因在这,只排了cost,没有考虑到如果cost相等应该也要先考虑字典序小的。
};
struct cmp2
{
bool operator()(node a,node b)
{
if (a.x!=b.x) return a.x>b.x;
else if (a.y!=b.y) return a.y>b.y;
}
};
int findteam(int k)
{
if (team[k]!=k) return team[k]=findteam(team[k]);
else return k;
}
int main()
{
while(~scanf("%d",&t))
{
for(;t>;t--)
{
scanf("%d",&n);
int l=;
priority_queue<node,vector<node>,cmp>Q;
priority_queue<node,vector<node>,cmp2>QQ;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
int x;
scanf("%d",&x);
if (j>i && x!=)
Q.push(node(i,j,x));
}
for(int i=;i<=n;i++) team[i]=i;
flag=;
while(!Q.empty())
{
node u=Q.top();
Q.pop();
int teamx=findteam(u.x);
int teamy=findteam(u.y);
if (teamx!=teamy)
{
team[teamy]=teamx;
QQ.push(u);
}
int k=findteam();
flag=;
for(int i=;i<=n;i++)
if (k!=findteam(i)) {flag=; break;}
if(flag) break;
}
if (!flag) printf("-1\n");
else
{
int i=;
while(!QQ.empty())
{
node u=QQ.top();
QQ.pop();
if (i++) printf(" ");
printf("%d %d",u.x,u.y);
}
printf("\n");
}
}
} return ;
}
ZOJ 3204 Connect them(最小生成树+最小字典序)的更多相关文章
- ZOJ - 3204 Connect them 最小生成树
Connect them ZOJ - 3204 You have n computers numbered from 1 to n and you want to connect them to ma ...
- ZOJ 3204 Connect them(字典序输出)
主要就是将最小生成树的边按字典序输出. 读取数据时,把较小的端点赋给u,较大的端点号赋值给v. 这里要用两次排序,写两个比较器: 第一次是将所有边从小到大排序,边权相同时按u从小到大,u相同时按v从小 ...
- zoj 3204 Connect them(最小生成树)
题意:裸最小生成树,主要是要按照字典序. 思路:模板 prim: #include<iostream> #include<stdio.h> #include<string ...
- ZOJ 3204 Connect them MST-Kruscal
这道题目麻烦在输出的时候需要按照字典序输出,不过写了 Compare 函数还是比较简单的 因为是裸的 Kruscal ,所以就直接上代码了- Source Code : //#pragma comme ...
- ZOJ 3204 Connect them 继续MST
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 题目大意: 让你求最小生成树,并且按照字典序输出哪些点连接.无解输出-1 ...
- zoj 3204 Connect them
最小生成树,我用的是并查集+贪心的写法. #include<stdio.h> #include<string.h> #include<math.h> #includ ...
- [ACM_模拟] ZJUT 1155 爱乐大街的门牌号 (规律 长为n的含k个逆序数的最小字典序)
Description ycc 喜欢古典音乐是一个 ZJUTACM 集训队中大家都知道的事情.为了更方便地聆听音乐,最近 ycc 特意把他的家搬到了爱乐大街(德语Philharmoniker-Stra ...
- bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)
设第一套为A,第二套为B 先对于每个B[i]判断他能否替代A[j],即B[i]与其他的A线性无关 设$B[i]=\sum\limits_{k}{c[k]*A[k]}$,那么只要看c[j]是否等于零即可 ...
- [模板] 匈牙利算法&&二分图最小字典序匹配
匈牙利算法 简介 匈牙利算法是一种求二分图最大匹配的算法. 时间复杂度: 邻接表/前向星: \(O(n * m)\), 邻接矩阵: \(O(n^3)\). 空间复杂度: 邻接表/前向星: \(O(n ...
随机推荐
- DRF(5) - 频率组件、url注册器、响应器、分页器
一.频率组件 1.使用DRF简单频率控制实现对用户进行访问频率控制 1)导入模块,定义频率类并继承SimpleRateThrottle # 导入模块 from rest_framework.throt ...
- GSM/GPRS/3G/4G
1.状态机机制的gprs拨号 像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时. 所以用 状态机 + 超时 的机制来实现比较合理. 如下代码片段来描 ...
- ufs emmc
UFS 2.0闪存标准使用的是串行界面,很像PATA.SATA的转换.并且它支持全双工运行,可同时读写操作,还支持指令队列. eMMC是半双工,读写必须分开执行,指令也是打包的. 而且UFS芯片不仅传 ...
- pt-osc测试
pt-osc测试 1.原表必须存在主键 PRIMARY KEY 或者 UNIQUE KEY The new table `darren`.`_t_user_new` does not have a P ...
- 一键配置IP地址脚本
#/bin/bash NETPWD='/etc/sysconfig/network-scripts/' read -p "please enten net num(1,2,3,4) : &q ...
- MySQL-Last_Errno: 1594
故障现象 :MySQL slave所在机器自动重启,启动MySQL后,查看主从信息如下: Error_code: 1594 mysql> show slave status \G . ro ...
- openstack认证实践
环境: 客户端:负责发送请求, 服务器:负责接受请求: 认证服务器keystone:负责认证 具体认证步骤: 1.客户端首先进行签名计算,将得到的签名字符串作为authorization发给keyst ...
- APPIUM API整理(python)---元素查找
最近在学习自动化框架appium,网上找一些API相关资料整理了一下 1.find_element_by_id find_element_by_id(self, id_): Finds element ...
- void及void指针介绍【转】
本文转载自:http://blog.csdn.net/renren900207/article/details/20769503 void类型指针(如void *p)所指向的数据类型不是确定的,或者说 ...
- hive 数据清理--数据去重
hive> select * from (select *,row_number() over (partition by id) num from t_link) t where t.num= ...