生活随笔
收集整理的這篇文章主要介紹了
C语言数据结构上机题:高铁网络
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
高鐵網絡?
描述:
國家建設高鐵網絡,網絡由一些連接城市的高鐵線路構成。現有高鐵建設情況可列為一張統計表,表中列出了每一條高鐵線路直接連接的兩個城市。國家的建設目標是全國每兩個城市之間都可以實現高鐵交通(但不一定有直接的高鐵線路相連,只要能間接通過高鐵線路可達即可)。問最少還要建設多少條高鐵線路?
輸入說明:
測試用例的第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语言数据结构上机题:高铁网络的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。