2016京勝杯 吃在工大 拓撲排序

2021-07-23 19:40:01 字數 1478 閱讀 5437

題目描述

jh和他的好朋友yz兩名程式設計師回訪母校合工大,準備在這住一段日子,都說「玩在安大,吃在工大」,jh又是一名典型吃貨,於是決定在工大食堂好好吃一段日子,但是,面對美食**:黃燜雞、風**鍋、麻辣香鍋、奧爾良烤翅…由於時間有限,jh不知道哪頓飯吃哪個菜好。 於是yz為了幫助他解決這個問題,也順便考考他,給他出了乙個問題:「黃燜雞必須在乾鍋花菜前面吃,乾鍋牛肉必須在乾鍋魷魚前面吃….你按這個要求下,就知道吃的順序啦」。jh抓抓頭,分分鐘寫了個程式搞定,現在,讓你來寫寫看?輸出一組jh符合條件下吃的食物的序列。 假設jh每頓只吃一種食物,且每頓吃的都不同,食物編號1到n。

輸入

先輸入乙個整數t,表示t(t < 50)組資料。 每組資料第一行輸出乙個整數,n,m,分別表示有n種食物,總共有m個約束條件,接下來m行每行輸入兩個正整數a,b( n > = a > 0,n > = b > 0),表示食物a必須在食物b之前吃。

輸出

各組資料輸出答案佔一行,輸出一組符合條件的序列(要求輸出字典序最大的那一組),如果答案不存在,輸出「-1」。

樣例輸入

1 4 3

1 2

2 3

4 3樣例輸出

4 1 2 3

思路

此題主要運用拓撲排序

首先讀取資料,存入乙個圖中,同時記錄每個節點的入度;

然後再將入度為0的節點加入都優先佇列中;

取優先佇列的隊首元素,並將此元素存到陣列result中,然後依次遍歷此節點的鄰接點,同時將鄰接點的入度減1,並將鄰接點中入度為0的加入到優先佇列中;

重複步驟三,直到隊列為空;

#include 

#include

#include

#include

using

namespace

std;

int g[1005][1005];

bool vis[1005];

int n, m;

bool isstart(int k)

}return

true;

}bool hashoop()

}return

false;

} void do()

}while(!pq.empty())

ans[loc++] = k;

vis[k] = true;

for(int i = 1; i <= n; ++ i)}}

if(hashoop())

else

cout

<< ans[i];

}cout

<< endl;

}}int main()

do();

}return

0;}

安徽省2016「京勝杯」程式設計大賽 A 砝碼稱重

time limit 1000 ms memory limit 65536 kb total submissions 61 accepted 37 小明非常喜愛物理,有一天,他對物理實驗室中常用的彈簧拉力計產生了興趣。實驗室中有兩種質量不同的砝碼,小明分別用a個第一種砝碼放在彈簧拉力計上和b個第二種...

安徽省2016「京勝杯」程式設計大賽 G 木條染色

time limit 1000 ms memory limit 65536 kb total submissions 134 accepted 20 小明是乙個非常浪漫的畫家,他喜歡畫各種奇奇怪怪的畫,雖然沒人理解他畫的究竟是什麼東西。有一天,他突發奇想,對於一根木條,他每次從木條中選取乙個區間 l...

安徽省2016「京勝杯」程式設計大賽 E 轉啊轉

time limit 1000 ms memory limit 65536 kb total submissions 59 accepted 15 在二維平面上,有乙個固定的圓和乙個固定的點 保證該點不在圓上 還有乙個動點在圓上以角速度w繞圓心一直轉。在t時刻,連線該動點與定點成一條直線k,求直線k...