1. 程式人生 > >Ordering Tasks-簡單的拓撲排序

Ordering Tasks-簡單的拓撲排序

題意:通過輸入m條兩任務間的優先順序,輸出一個可能的任務順序;

思路;拓撲排序,就是建立一個圖,每次選擇入度為零的頂點,將與之關聯的點的入度減一。

拓撲的關鍵兩步驟:

1.入度為零的頂點輸出;

2.將該點連得邊去掉。(即與之關聯點的入度減一)

#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
const int maxn=101;
int Adj[maxn][maxn], inDegree[maxn], n, m;
stack<int> stk;

void CreatGraph(){
	memset(Adj, 0, sizeof(Adj));
	memset(inDegree, 0, sizeof(inDegree));
	int u, v;
	while(m--)
	{
		cin>>u>>v;
		Adj[u][v]=1;
		inDegree[v]++;
	}
	for(int i=1; i<=n; i++)//將入度為零的點入棧。
		if(inDegree[i]==0)
			stk.push(i);
	return;
}

void tpSort(){
	int order[n];//輸出的順序
	int it, cnt=0;
	while(stk.size())//棧不為空就說明還有入度為零的點未輸出。
	{
		it=stk.top();
		stk.pop();
		for(int i=1; i<=n; i++)
		{
			if(Adj[it][i] && inDegree[i])
				inDegree[i]--;
			if(Adj[it][i] && !inDegree[i])//入度為零則進棧。
				stk.push(i);
		}
		order[cnt++]=it;//將該點存入序列。
	}
	for(int i=0; i<n-1; i++)
		cout<<order[i]<<" ";
		cout<<order[n-1]<<endl;
	return;
}


int main(){
	while(cin>>n>>m && n+m)
	{
		CreatGraph();
		tpSort();
	}
	return 0;
} 


相關推薦

【uva-10305】Ordering Tasks排序中最簡單的一道

題目大意: m是任務數,n是已知偏序個數。 接下來n行是偏序。 最後輸出滿足偏序條件的任意一組。 很隨意很和諧的。 連谷歌翻譯都不用的。 /* uva 10305 by zhuhua Time limit: 3000 ms AC Time:

UVA 10305- Ordering Tasks(經典排序)

John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have already been e

D - Ordering Tasks排序

lap sed pan bre mem eof event int vector D - Ordering Tasks 題意:給個有向圖,進行拓撲排序 1 /***********************************************/

Ordering Tasks排序

Problem F Ordering Tasks Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n tasks to do.

UVA 10305 —— Ordering Tasks排序入門)

10305 - Ordering Tasks Time limit: 3.000 seconds Problem F Ordering Tasks Input: standard input Output: standard output Time Limit: 1 se

Ordering Tasks-簡單排序

題意:通過輸入m條兩任務間的優先順序,輸出一個可能的任務順序; 思路;拓撲排序,就是建立一個圖,每次選擇入度為零的頂點,將與之關聯的點的入度減一。 拓撲的關鍵兩步驟: 1.入度為零的頂點輸出; 2.

Ordering Tasks 排序

div == i++ out pri relation algo -- char John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one t

【Vj作業】【排序經典理解題】Ordering Tasks 1、Kahn算法;2、基於DFS的算法。

pri from have for 失敗 dep empty enc there 2018-02-13 鏈接 https://cn.vjudge.net/contest/211129#problem/D John has n tasks to do. Unfortuna

UVA 10305 Ordering Tasks(排序的隊列解法)

題目 space while 一行 class == 整數 cstring 關系 題目鏈接: https://vjudge.net/problem/UVA-10305#author=goodlife2017 題目描述 John有n個任務,但是有些任務需要在做完另外一些任務後

Ordering Tasks UVA - 10305(排序

size main std 有環 eof color 完全 一個 技術 在一個有向圖中,對所有的節點進行排序,要求沒有一個節點指向它前面的節點。 先統計所有節點的入度,對於入度為0的節點就可以分離出來,然後把這個節點指向的節點的入度減一。 一直做改操作,直到所有的節點都被分

Ordering Tasks 排序基礎水題 佇列和dfs實現

今天剛學的拓撲排序,大概搞懂後發現這題是赤裸裸的水題。 於是按自己想法敲了一遍,用queue做的,也就是Kahn演算法,複雜度o(V+E),調完交上去,WA了。。。 於是檢查了一遍又交了一發,還是WA。。。 我還以為是用queue的問題,改成stack也WA,然後乾脆放棄S

排序java簡單實現

import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Sca

Sorting It All Out(簡單排序

題目來源:[NWPU][2014][TRN][16]圖論拓撲排序  A 題 http://vjudge.net/contest/view.action?cid=51448#problem/A 作者:npufz 題目: A - Sorting It All Out

確定比賽名次(簡單排序)

確定比賽名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 505 Accepted Submiss

【topoSort排序】1424. 獎金(簡單題目看排序

1424.獎金 Description 由於無敵的凡凡在2005年世界英俊帥氣男總決選中勝出,Yali Company總經理Mr.Z心情好,決定給每位員工發獎金。公司決定以每個人本年在公司的

排序簡單應用poj2367

//題目大意:輸入n,接下來n行,每一行的編號都比這一行的數字優先 //關於拓撲排序的內容可以看本部落格http://blog.csdn.net/fengsigaoju/article/details

hdu1285確定比賽名次(最簡單排序)

Input 輸入有若干組,每組中的第一行為二個數N(1<=N<=500),M;其中N表示隊伍的個數,M表示接著有M行的輸入資料。接下來的M行資料中,每行也有兩個整數P1,P2表示即P1隊贏

排序入門(真的很簡單

在一個有向圖中,對所有的節點進行排序,要求沒有一個節點指向它前面的節點。先統計所有節點的入度,對於入度為0的節點就可以分離出來,然後把這個節點指向的節點的入度減一。一直做改操作,直到所有的節點都被分離出來。如果最後不存在入度為0的節點,那就說明有環,不存在拓撲排序,也就是很多

排序

i++ nbsp 分享 方案 emp obi res bcb 選修課 概述 對一個 有向無環圖(Directed Acyclic Graph, DAG) G 進行拓撲排序,是將 G 中的所有頂點排成一個線性序列, 使得圖中任意一對頂點 u 和 v,若邊 <u,v>

排序講解

name data 技術 com con 計算 16px edge idt 在這裏我們要說的拓撲排序是有前提的 我們在這裏說的拓撲排序是基於有向無環圖的!!!。 (⊙o⊙)…我所說的有向無環圖都知道是什麽東西吧。。 如果不知道,我們下面