蓝桥杯-卡勒沃夫之弱水路三千(提高型)-拓扑排序-java

算法提高 卡勒沃夫之弱水路三千(提高型)  
时间限制:1.0s   内存限制:512.0MB
   
问题描述
  锦瑟年华谁与度 莫问情归处 只影向斜阳 剑吼西风 欲把春留驻
  天涯芳草无归路 回首花无数 解语自销魂 弱袂萦春 尘缘不相误
  ......
  在卡勒沃夫充满文学杀伤力的声音中,身处紫荆2号楼202B的四位远近高低各不同的室友纷纷回忆起了各自波澜起伏的过去,并对长在百草园,邻有百花谷的现状表达了各自的见解。
  某Q:"...我小学就开窍了...她的父母说我很好,但是...今天又和北林的联系了..."
  某X:"...差点就成了,结果到学校了...这个方法放假了我去对我的同桌用!..."
  某W:"..."(千言万语不言中,有大量的故事等待考古)
  某Z:"...为了来清华...咱们审美观不一样,不会抢..."
  ......
  卡勒沃夫在这个不朽的夜话中搜集出了某人零散的历任女友资料,为了强迫某人将他出的题目的标程交出,现在卡勒沃夫需要一个能将这些零散信息整合起来的程序。伴随着雄壮委婉动人的音乐,身为程序设计快男(超女)的你降临了!卡勒沃夫正对着您做Orz状并请求着:"神牛啊~请施舍给我一段程序把~偶米头发~"。。
输入格式
  第一行为一个不超过5的整数T,表示数据的组数。之后每组数据的一行为一个不超过100的整数n。之后n行每行有两个用单个空格隔开的字符串(每个字符串只有英文大小写字母,长度不超过10),为两位mm的名字。每行第一个mm先于第二个mm成为某人的女友。
  在这里我们假装诅咒某人不会同时被两个或两个以上mm泡,某个mm抛弃了某人后不会再吃回头草,同时卡勒沃夫深邃的洞察力使得他收集到了充足的信息以确定某人女友的先后顺序。
  在小数据组中出现的人物不超过13个
输出格式
  输出T行,每行对应一组数据,并按照mm们从先到后成为某人女友的顺序输出她们的名字,各个名字间用一个空格隔开。
样例输入
2
2
RY Unknown
YSZ RY
3
tomorrow yestoday
tomorrow today
today yestoday

样例输出

YSZ RY Unknown
tomorrow today yestoday


解题思路: 该题没a过去  这是一道典型的拓扑排序问题
                     每给出两个女友 就在这两个人身上连一条有向边
                     前一个指向后一个  在输入的过程中 记录一下每个女友身上的入度
                     找出所有入度为0的女友 放入队列 然后每次从队列中拿出一个女友
                     遍历 看这个女友 指向谁 指向那个人 这个人身上的入度就要减一
                     如果入度为0 就继续放入队列 直到队列为空
                     然后输出  emmmm 没a过去 我看了一下测试数据
                     发现里面有环 题中没说有环的时候该怎么处理 100个数据 我自己就不推了。。。
                    好麻烦 哪位大佬知道怎么回事 可以教我一下 以下是代码



package 算法提高;

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Scanner;

public class 卡勒沃夫之弱水路三千 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        for (int i = 0; i < t; i++) {
            Map<String, Integer> map = new HashMap<>();
            int [] limit = new int [300];
            int n = scanner.nextInt();
            int [][] tu = new int [300][300];
            String [] name = new String [300];
            int k = 1;
            for (int j = 0; j < n; j++) {
                String oneMM = scanner.next();
                String twoMM = scanner.next();
                Integer one = map.get(oneMM);
                Integer two = map.get(twoMM);
                if (one == null) {
                    map.put(oneMM, k);
                    name[k] = oneMM;
                    k++;
                }
                if (two == null) {
                    map.put(twoMM, k);
                    name[k] = twoMM;
                    k ++;
                }
                one = map.get(oneMM);
                two = map.get(twoMM);
                limit[two] ++;
                tu[one][two] = 1;
            }
            LinkedList<Integer> queue = new LinkedList<>();
            for (int j = 1; j < k; j++) {
                if (limit[j] == 0) {
                    queue.add(j);
                }
            }
            List<Integer> list = new ArrayList<>();
            while (!queue.isEmpty()) {
                Integer head = queue.poll();
                list.add(head);
                for (int j = 1; j < k; j++) {
                    if (tu[head][j] == 1) {
                        tu[head][j] = 0;
                        limit[j] -= 1;
                        if (limit[j] == 0) {
                            queue.add(j);
                        }
                    }
                }
            }
            for (int j = 0; j < list.size(); j++) {
                if (j == 0) {
                    System.out.print(name[list.get(j)]);
                }else {
                    System.out.print(" "+name[list.get(j)]);
                }
            }
            System.out.println();
        }
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值