日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

poj 4084:拓扑排序

發(fā)布時(shí)間:2023/12/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 4084:拓扑排序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

poj 4084:拓?fù)渑判?/h2>


非常好的題目,惡心的算法

描寫(xiě)敘述

給出一個(gè)圖的結(jié)構(gòu),輸出其拓?fù)渑判蛐蛄?#xff0c;要求在同等條件下。編號(hào)小的頂點(diǎn)在前。


輸入 若干行整數(shù),第一行有2個(gè)數(shù),分別為頂點(diǎn)數(shù)v和弧數(shù)a,接下來(lái)有a行。每一行有2個(gè)數(shù),各自是該條弧所關(guān)聯(lián)的兩個(gè)頂點(diǎn)編號(hào)。


v<=100, a<=500

輸出 若干個(gè)空格隔開(kāi)的頂點(diǎn)構(gòu)成的序列(用小寫(xiě)字母)。 例子輸入 6 8 1 2 1 3 1 4 3 2 3 5 4 5 6 4 6 5 例子輸出 v1 v3 v2 v6 v4 v5

解題方案

顯然這是有向圖。然后用了一個(gè)個(gè)人感覺(jué)惡心的算法,個(gè)人建了一個(gè)倒排表。比如針對(duì)上述數(shù)據(jù)


對(duì)于invertlist的下標(biāo) i。其相應(yīng)的元素為一個(gè)list,其為 能到達(dá) i+1 的結(jié)點(diǎn)集合

比如 i =1 時(shí)。 則有 1 -> 2 和 3 -> 2

有這樣一個(gè)表我們就非常方便的檢測(cè)出哪些結(jié)點(diǎn)入度為 0,然后就為拓?fù)渑判蚬タ肆俗隽朔浅:玫匿亯|


個(gè)人代碼

#include <iostream> #include <fstream> #include <list> #include <vector> #include <algorithm> using namespace std;typedef pair<int,int> edge;typedef list<int> *elem;void Topological_sort(vector<elem> &invertList); void read_data(edge* & data,int &v,int &e); void main_solution(); vector<elem> invert_list(edge * data,int v,int e);int main() {main_solution();system("pause");return 0; }void read_data(edge* & data,int &v,int &e) {ifstream reader;reader.open("data.txt");reader>>v;reader>>e;data = new edge[e];for(int i=0;i<e;i++){reader>>data[i].first;reader>>data[i].second;}reader.close(); }void main_solution() {edge* data;int v;int e;read_data( data,v,e );vector<elem> invertList = invert_list( data,v,e );Topological_sort(invertList); }vector<elem> invert_list(edge * data,int v,int e) {vector<elem> result;result.resize(v);for(int i =0;i<v;i++){result[i] = new list<int>;}for(int i=0;i<e;i++){result[ data[i].second-1 ]->push_back(data[i].first);}return result ; }void Topological_sort(vector<elem> &invertList) {const int v = invertList.size(); bool * flag = new bool[v];for(int i=0;i<v;i++){flag[i] = true;}// 找出 v 個(gè)元素for(int i=0;i<v;i++){// 找出一個(gè)元素int j;for(j=0;j<v;j++){// 已經(jīng)找到 Vj+1if( flag[j] && invertList[j]->empty() ){break;}}// 踢出 Vj+1flag[j] = false ;for( int n=0;n<v;n++ ){for(list<int>::iterator it = invertList[n]->begin(); it != invertList[n]->end(); it++){if( *it == j+1 ){invertList[n]->erase(it);break;}}}cout<<"v"<<j+1<<" ";}cout<<endl; }


轉(zhuǎn)載于:https://www.cnblogs.com/jzdwajue/p/6874917.html

總結(jié)

以上是生活随笔為你收集整理的poj 4084:拓扑排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。