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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

poj 4084:拓扑排序

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

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


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

描寫敘述

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


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


v<=100, a<=500

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

解題方案

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


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

比如 i =1 時。 則有 1 -> 2 和 3 -> 2

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


個人代碼

#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 個元素for(int i=0;i<v;i++){// 找出一個元素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:拓扑排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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