回復 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。 |