返回列表 發帖

資料結構 401 圖形的表示與儲存

資料結構 401 圖形的表示與儲存
1. 題目說明:
請依下列題意進行作答,使輸出值符合題意要求。

2. 設計說明:
(1) 撰寫程式讓使用者讀取一個以相鄰矩陣(Adjacency Matrix)表示圖形(Graph)的 read.txt 檔案,檔案內容與轉換方式如下圖。


以相鄰矩陣表示圖形

(2) read.txt 檔案內儲存的是一個無向(Undirected)且邊有權重(Weighted)的對稱矩陣圖形,請依編號順序(1,2,3,...)輸出所有節點(Vertex)的分支度(Degree),並輸出與各節點相連邊的權重總和中,最大與最小的差。

提示:節點數量小於 10 個。

提示:邊的權重應為大於 0 的正整數;若為 0,則代表無此邊。

3. 輸入輸出:
輸入說明
讀取 read.txt 檔案內容。

輸出說明
第 1 列:依照編號順序(1,2,3,...)輸出所有節點的分支度,各分支度間請使用半形逗號(,)間隔。
第 2 列:輸出與各節點相連邊的權重總和中,最大與最小的差。

範例輸入1


範例輸出1
Degree:2,4,3,2,3
8
範例輸入2


範例輸出2
Degree:1,4,2,5,2,2,3,1
17
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊
May

回復 1# may
題目說明簡述:
你會讀取一個檔案 read.txt,這個檔案是一個無向圖(Undirected Graph)的鄰接矩陣(Adjacency Matrix),矩陣中:

行列對應的是節點(Vertex);

欄位中的數值代表這兩個節點之間的邊(Edge)權重(Weight);

如果數值是 0,就代表兩節點之間沒有邊;

這個矩陣是對稱矩陣(對於無向圖而言);

接著程式會輸出:

每個節點的分支度(Degree) → 即有幾條邊連到它(非零的數量);

每個節點總權重和的最大值與最小值的差。
May

TOP

輸入格式範例

回復 2# may
輸入格式範例(read.txt):
如果 read.txt 像這樣:
0,3,5,0,0
3,0,4,2,1
5,4,0,0,2
0,2,0,0,3
0,1,2,3,0
這就是一個 5x5 的鄰接矩陣。

程式碼逐行解析:

#include<bits/stdc++.h>
using namespace std;
這是 C++ 的標準寫法,包含所有標頭檔(方便但不推薦用在正式場合)。

ifstream ifs;
建立一個檔案輸入物件 ifs(input file stream)。

string str;
用來存每一行從檔案讀入的字串(矩陣的一行)。

int maxV=INT_MIN, minV=INT_MAX, idx=0;
maxV:儲存所有節點的總權重最大值。

minV:儲存所有節點的總權重最小值。

idx:行數(也代表第幾個節點)。

開始讀檔與處理

ifs.open("read.txt");
打開 read.txt 檔案。

cout<<"Degree:";
先印出 Degree 的標題。

每讀入一行(即每個節點)

while(ifs>>str)
逐行讀入,str 會是像這樣的字串:"0,3,5,0,0"。
idx++;
replace(begin(str),end(str),',',' ');
把 , 換成空格,讓它可以被 stringstream 拆分,例如 0,3,5,0,0 → 0 3 5 0 0。

拆分每行字串、計算度與總權重
stringstream ss;
ss<<str;
int n, sum1=0, sum2=0;
ss 是字串串流;

sum1 計算 degree(有幾個非 0);

sum2 計算該節點所有權重加總。

while(ss>>n)
{
    if(n>0)
    {
        sum1++;
        sum2+=n;
    }
}
針對每個節點:

權重大於 0 → 有邊,sum1++;

權重累加到 sum2。

更新全圖最大與最小的節點總權重
minV=min(sum2, minV);
maxV=max(sum2, maxV);
更新整張圖中,節點權重總和的最大與最小值。

輸出 degree:

if(idx>1)
    cout<<",";
cout<<sum1;
以逗號區隔輸出 degree(分支度)。

最後輸出最大與最小權重總和的差值:
cout<<endl<<maxV-minV;
輸出說明範例:
如果 read.txt 是(8 節點):
0,2,0,6,0,0,0,0
2,0,4,3,5,0,0,0
0,4,0,0,0,6,0,0
6,3,0,0,2,4,1,0
0,5,0,2,0,0,0,9
0,0,6,4,0,0,5,0
0,0,0,1,0,5,0,7
0,0,0,0,9,0,7,0
輸出會是:
Degree:1,4,2,5,2,2,3,1
17
因為:

每行有多少個非零數字(不包含自己)就是 degree;

每行的非零數字加總就是總權重(例如第 4 行:6+3+2+4+1=16);

所有節點的總權重最大為 21,最小為 4 → 差值是 17。
May

TOP

返回列表