藍橋杯 卡勒沃夫之弱水路三千(提高型) 拓撲排序+Map

一葉之修發表於2019-03-10

藍橋杯歷年真題題目及題解目錄彙總

 

題目描述

錦瑟年華誰與度  莫問情歸處  隻影向斜陽  劍吼西風  欲把春留駐 
天涯芳草無歸路  回首花無數  解語自銷魂  弱袂縈春  塵緣不相誤 
...... 
在卡勒沃夫充滿文學殺傷力的聲音中,身處紫荊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

 

拓撲排序入門

這題要用到Map來處理字串和下標的問題,一遍這樣給出的話,資料規模不會很大,考你怎麼處理資料把,另外鄰接表存圖,佇列輸出,還有這題還說人物不超過13,結果給的資料是100= =,所以還是要開大點~

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;


public class 藍橋杯_卡勒沃夫之弱水路三千_提高型 {

	static HashMap<String,Integer> map = new HashMap<>();
	static ArrayList<Integer> list = new ArrayList<>();
	static ArrayList<Integer>[] edge = new ArrayList[105];
	
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int T = in.nextInt();
		
		while(T-->0) {
			map.clear();
			list.clear();
			int n=0;
			int m = in.nextInt();
			int[] w = new int[105];
			for(int i=0;i<105;i++)
				edge[i] = new ArrayList<>();
			
			
			
			while(m-->0) {
				String s1 = in.next();
				String s2 = in.next();
				if(!map.containsKey(s1))
					map.put(s1,n++);
				if(!map.containsKey(s2))
					map.put(s2,n++);
				w[map.get(s2)]++;
				edge[map.get(s1)].add(map.get(s2));
			}
			
			Queue<Integer> q = new LinkedList<>();
			for(int i:map.values())
				if(w[i]==0)
					q.add(i);
			while(!q.isEmpty()) {
				int u = q.poll();
				list.add(u);
				for(int v:edge[u]) {
					w[v]--;
					if(w[v]==0)
						q.add(v);
				}
			}
			
			if(list.size()==n) {
				for(int i=0;i<n;i++) {
					String x = "";
					for(String s:map.keySet())
						if(list.get(i)==map.get(s)) {
							x = s;
							break;
						}

					if(i==n-1)
						System.out.println(x);
					else
						System.out.print(x+" ");
					
				}
			}
			else
				System.out.println("NO");
				
			
			
		}
		
	}
	
}

 

相關文章