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 = cjicii = 0, 1 <= ij <= 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: a1a2, ...ap.
Another solution B different from A is a line of q integers: b1b2, ...bq.
A is lexicographically smaller than B if and only if:
(1) there exists a positive integer r (r <= pr <= 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[105];
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>0;t--)
    {
        scanf("%d",&n);
        int l=0;
        priority_queue<node,vector<node>,cmp>Q;
        priority_queue<node,vector<node>,cmp2>QQ;
        for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
        {
            int x;
            scanf("%d",&x);
            if (j>i && x!=0)
                Q.push(node(i,j,x));
        }
        for(int i=1;i<=n;i++) team[i]=i;
        flag=0;
        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(1);
            flag=1;
            for(int i=2;i<=n;i++)
             if (k!=findteam(i)) {flag=0; break;}
            if(flag) break;
        }
        if (!flag) printf("-1\n");
        else
        {
            int i=0;
            while(!QQ.empty())
            {
                node u=QQ.top();
                QQ.pop();
                if (i++) printf(" ");
                printf("%d %d",u.x,u.y);
            }
            printf("\n");
        }
    }
    }

    return 0;
}
时间: 2024-08-25 11:39:53

ZOJ 3204 Connect them(最小生成树+最小字典序)的相关文章

ZOJ 3204 Connect them (C) 最小生成树kruskal

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 i and j is the sa

ZOJ 3204 Connect them(最小生成树之Krusal 输出字典序最小的)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 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 i and j is

ZOJ 3204 Connect them(最小生成树:kruscal算法)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3204 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 connecti

zoj 3204 Connect them(最小生成树)

题意:裸最小生成树,主要是要按照字典序. 思路:模板 prim: #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define INF 0x7fffffff #define MAXN 128 bool vis[MAXN]; int lowu[MAXN];//记录起始边(已加入集合中的边) int lowc[MAX

ZOJ 3204 Connect them MST-Kruscal

这道题目麻烦在输出的时候需要按照字典序输出,不过写了 Compare 函数还是比较简单的 因为是裸的 Kruscal ,所以就直接上代码了- Source Code : //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <fstream> #include <cstring

ZOJ 3204: Connect Them

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 #include <iostream> #include <algorithm> #include <limits> #include <queue> using namespace std; const int MAXN = 105, INF = numeric_limits<int>::max(); typedef

ZOJ 2587 Unique Attack 判断最小割是否唯一

很裸的判断最小割是否唯一.判断方法是先做一遍最大流求最小割,然后从源点和汇点分别遍历所有能够到达的点,看是否覆盖了所有的点,如果覆盖了所有的点,那就是唯一的,否则就是不唯一的. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostr

拼接最小字典序

转载请标明出处http://www.cnblogs.com/haozhengfei/p/63b2460bceae42e55f0c2d150bde663b.html 拼接最小字典序 拼接最小字典序练习 第8节 拼接最小字典序练习题 对于一个给定的字符串数组,请找到一种拼接顺序,使所有小字符串拼接成的大字符串是所有可能的拼接中字典序最小的. 给定一个字符串数组strs,同时给定它的大小,请返回拼接成的串. 测试样例: ["abc","de"],2 "abcde

UVa 1584 Circular Sequence(环形串最小字典序)

题意  给你一个环形串   输出它以某一位为起点顺时针得到串的最小字典序 直接模拟   每次后移一位比较字典序即可  注意不能用strcpy(s+1,s)这样后移  strcpy复制地址不能有重叠部分 #include<cstdio> #include<cstring> using namespace std; const int N = 150; char s[N], ans[N], c; int t, l; int main() { scanf ("%d",