題目描述
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...