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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言数据结构上机题:高铁网络

發布時間:2024/1/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言数据结构上机题:高铁网络 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

高鐵網絡?

描述:

國家建設高鐵網絡,網絡由一些連接城市的高鐵線路構成?,F有高鐵建設情況可列為一張統計表,表中列出了每一條高鐵線路直接連接的兩個城市。國家的建設目標是全國每兩個城市之間都可以實現高鐵交通(但不一定有直接的高鐵線路相連,只要能間接通過高鐵線路可達即可)。問最少還要建設多少條高鐵線路?

輸入說明:

測試用例的第1行給出兩個正整數,分別是城市數目N(<1000)和現有高鐵線路數目M。隨后的M行對應M條高鐵線路,每行給出一對正整數,分別是該條高鐵線路直接連接的兩個城市的編號。為簡單起見,城市從1到N編號。

輸出說明:

在一行上輸出最少還需要建設多少條高鐵線路。

思路:

提取問題實質為求連通分量的個數減一。而求連通分量可用深度優先或廣度優先搜索求解,也可用MFSet求解 。

當然其實也不應該僅僅連通分量減一,僅僅是做題的角度,實際上應該考慮比如這個點沒有邊的情況,比如沒有與A點相連的弧。

第一次用數組做的,然后超時挺嚴重的,改用了鄰接表的做法。(也可能是數組的代碼寫錯了有bug)

參考:
數據結構 圖的鄰接表_夜雨檸檬-CSDN博客_數據結構鄰接表? (寫的特別好)

//使用鄰接表的結構#include<iostream> #include<stack> using namespace std; #define MAXVERTEX 1000 //最大頂點數 typedef struct ArcNode //邊表節點 {int adjvex; //鄰接點域,存儲該頂點對應的下標struct ArcNode *next; //鏈域,指向下一個鄰接點 }ArcNode;typedef struct VertexNode //頂點表節點 {int data; //存儲頂點數據的信息ArcNode *firstarc; //邊表頭指針 }VertexNode, AdjList[MAXVERTEX];typedef struct {AdjList adjlist; //定義鄰接表int numvertex; //當前鄰接表的頂點數int numarc; //當前鄰接表的邊數 }GraphAdjList; int main() {//建立圖的鄰接表GraphAdjList G;ArcNode *e;//節點 cin >> G.numvertex; //輸入當前圖的頂點數 Ncin >> G.numarc; //輸入當前圖的邊數 Mfor(int i = 1; i <= G.numvertex; i++) //建立頂點表{G.adjlist[i].data=i; //頂點信息 G.adjlist[i].firstarc = NULL; //將表邊指針置為空}for(int k = 1; k <= G.numarc; k++){int i, j;cin >> i >> j ; e = new ArcNode; //創建一個表邊節點指針e->adjvex = j;e->next = G.adjlist[i].firstarc;G.adjlist[i].firstarc = e;//因為是無向圖,彼此相對稱e = new ArcNode; //創建一個表邊節點指針e->adjvex = i;e->next = G.adjlist[j].firstarc;G.adjlist[j].firstarc = e;}//def遍歷此表并且計算子圖數目 int count=0;for(int i = 1; i <= G.numvertex; i++){//逐個遍歷頂點 if(G.adjlist[i].data){//條件,沒有被遍歷過 count++;stack<int> vertex;vertex.push(i);G.adjlist[i].data=0;//在頂點表上面標識 while(vertex.size()){int m=vertex.top();vertex.pop();ArcNode *p = G.adjlist[m].firstarc;while(p){if(G.adjlist[p->adjvex].data)//在沒有訪問過的時候 {// printf("%d",p->adjvex);vertex.push(p->adjvex);G.adjlist[p->adjvex].data=0;} p=p->next;}} }}printf("%d",count-1);return 1; }

總結

以上是生活随笔為你收集整理的C语言数据结构上机题:高铁网络的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。