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

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

生活随笔

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

编程问答

4084:拓扑排序

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

題目鏈接:http://bailian.openjudge.cn/practice/4084/

總時(shí)間限制:?1000ms?內(nèi)存限制:?65536kB描述

給出一個(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

這道題可以考慮使用優(yōu)先隊(duì)列。下面的代碼偷懶,直接使用最簡(jiǎn)單粗暴的方法:

1 #include<stdio.h> 2 #include<iostream> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<algorithm> 6 using namespace std; 7 8 #define maxN 1000 9 #define maxM 2000 10 11 struct NODE 12 { 13 int from; //邊的起點(diǎn) 14 int to; //邊的終點(diǎn) 15 }; 16 struct NODE edge[maxM]; //邊數(shù)組 17 int head[maxN]; //存儲(chǔ)出發(fā)點(diǎn)為 Vi 的第一條邊在 edge[ ]中的位置,一般初始化為-1。 18 19 int n,m;//n個(gè)點(diǎn)m條邊的圖 20 int indegree[maxN]; 21 int ttt; 22 23 bool cmp(NODE a,NODE b) 24 { 25 if(a.from==b.from)return a.to<b.to; 26 return a.from<b.from; 27 } 28 void topo_sort();//利用隊(duì)列完成無(wú)前驅(qū)節(jié)點(diǎn)優(yōu)先的拓?fù)渑判? 編號(hào)小的節(jié)點(diǎn)優(yōu)先輸出. 29 int main(int argc, char *argv[]) 30 { 31 int i; 32 33 34 scanf("%d%d",&n,&m); 35 for(i=0;i<m;i++) cin>>edge[i].from>>edge[i].to; 36 sort(edge,edge+m,cmp); 37 //for(i=0;i<m;i++) printf("%d %d\n",edge[i].from,edge[i].to);//測(cè)試代碼 38 memset(head,-1,sizeof(head)); 39 head[edge[0].from]=0; 40 indegree[edge[0].to]=1; 41 for(i=1;i<m;i++) 42 { 43 if(edge[i].from != edge[i-1].from) 44 { 45 head[edge[i].from]=i;//標(biāo)記以第 i 個(gè)點(diǎn)做起點(diǎn)的第一條邊在 edge[]的位置 46 } 47 indegree[edge[i].to]++;//記錄各個(gè)頂點(diǎn)的入度 48 } 49 //for(i=1;i<=n;i++) printf("%d ",indegree[i]); printf("\n"); //測(cè)試代碼:輸出各個(gè)點(diǎn)的入度.(題目數(shù)據(jù)頂點(diǎn)編號(hào)從1開(kāi)始) 50 51 topo_sort(); 52 53 return 0; 54 } 55 56 void topo_sort()//利用隊(duì)列完成無(wú)前驅(qū)節(jié)點(diǎn)優(yōu)先的拓?fù)渑判? 編號(hào)小的節(jié)點(diǎn)優(yōu)先輸出. 57 { 58 int i,k; 59 ttt=n; 60 while(ttt>0) 61 { 62 for(i=1;i<=n;i++)//掃描尋找編號(hào)最小的無(wú)前驅(qū)節(jié)點(diǎn) 63 { 64 if(indegree[i]==0) 65 { 66 printf("v%d ",i); 67 ttt--; 68 if(head[i]!=-1)//該頂點(diǎn)有鄰接點(diǎn) 69 { 70 //遍歷該頂點(diǎn)出發(fā)的全部有向邊,把這些邊的終點(diǎn)的入度減1. 71 for(k=head[i];edge[k].from==i&&k<m;k++) 72 { 73 indegree[edge[k].to]--; 74 } 75 head[i]=-1;//刪除該頂點(diǎn)出發(fā)的全部有向邊 76 } 77 indegree[i]=-1; 78 break; 79 } 80 } 81 } 82 }

?

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

總結(jié)

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

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