當前位置:網站首頁>亞線性的近似最小支撐樹
亞線性的近似最小支撐樹
2022-01-28 07:52:05 【叫我老伯】
問題
自己給出ϵ的值並帶入計算
算法過程
代碼
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <queue>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define QueueSize 1000
class Env
{
public:
vector<vector<int>> graph;
Env()
{
graph = getGraph("rand2_2.csv"); //rand1_1.csv rand1_2.csv rand1_3.csv rand2_1.csv rand2_2.csv 共5個測試用例
}
vector<vector<int>> getGraph(string file_path)
{
vector<vector<int>> user_arr;
ifstream fp(file_path);
string line;
while (getline(fp, line))
{
vector<int> data_line;
string number;
istringstream readstr(line);
for (int j = 0; j < 33; j++)
{
getline(readstr, number, ',');
data_line.push_back(atoi(number.c_str()));
}
user_arr.push_back(data_line);
}
return user_arr;
}
};
// 所有的代碼都需要寫在 Algo 類內,自行定義其他需要的變量或函數
class Algo
{
public:
Algo()
{
cout << "algo ok" << endl;
}
typedef struct
{
int front;
int rear;
int count;
int data[QueueSize];
} Queue;
void InitQueue(Queue *M)
{
M->front = M->rear = 0;
M->count = 0;
}
int QueueEmpty(Queue *M)
{
if (M->count == 0)
return 1;
else
return 0;
}
void EnQueue(Queue *M, int x)
{
M->count++;
M->data[M->rear] = x;
M->rear = (M->rear + 1) % QueueSize;
}
int DeQueue(Queue *M)
{
int temp;
temp = M->data[M->front];
M->count--;
M->front = (M->front + 1) % QueueSize;
return temp;
}
double cnum(vector<vector<int>> graph)
{
Queue M;
InitQueue(&M);
double a = 0.1;
double b[1000];
double n;
n = 2 / a;
srand((unsigned)time(NULL));
for (int k = 1; k < 61; k++) //取樣60個數
{
InitQueue(&M);
int visited[33];
for (int m = 0; m < 33; m++)
visited[m] = 0;
int i = rand() % 33;
visited[i] = 1;
EnQueue(&M, i);
double t = 1;
while (!QueueEmpty(&M))
{
i = DeQueue(&M);
for (int j = 0; j < 33; j++)
{
if (double(j) <= double(n))
{
if (graph[i][j] > 0 && visited[j] == 0)
{
t = double(t + 1);
visited[j] = 1;
EnQueue(&M, j);
}
}
}
}
if (t != 0)
{
b[k] = double(1 / t);
}
else
{
b[k] = 0;
}
}
double sum;
for (int k = 1; k < 61; k++)
{
sum = b[k] + sum;
}
sum = sum / 60 * 33;
cout << "連通分量:" << sum << endl;
return sum;
}
int run(Env env)
{
//在此寫入你的代碼 env.graph 為目標矩陣
int w = 0;
for (int i = 1; i < 33; i++)
{
for (int j = 0; j < 33; j++)
{
if (w < env.graph[i][j])
{
w = env.graph[i][j];
}
}
}
cout << "最大權重:" << w << endl;
double sums, W;
double n = 33;
for (int n = 0; n < w-1; n++)
{
for (int i = 0; i < 33; i++)
{
for (int j = 0; j < 33; j++)
{
if (env.graph[i][j] = w - n)
{
env.graph[i][j] == 0;
}
}
}
sums = double(sums + cnum(env.graph));
}
cout <<"連通分量總和"<< sums << endl;
W = double(n - w + sums);
cout << "最優解:" << W << endl;
return 0; //修改為返回正確的結果
}
};
int main()
{
Algo algo;
Env env;
time_t start = clock();
algo.run(env);
time_t end = clock();
cout << "程序耗時: " << double(end - start) / CLOCKS_PER_SEC << " ms" << endl;
cout << "占用內存:" << sizeof(algo) << " byte" << endl;
return 0;
}
結果
版權聲明
本文為[叫我老伯]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201280752052695.html
邊欄推薦
猜你喜歡
隨機推薦
- uniapp上傳圖片及組件傳值
- 瑞利年金險資金保障安全嗎?收益高不高啊?
- 華為手機USB連不上電腦的解决方法
- Flutter 2,移動金融應用開發
- 關於st25系列NFC標簽簡單介紹及st25TV系列用於門禁讀取時的注意事項總結
- 關於用ffmpeg轉手機視頻發現視頻長寬倒了的問題
- 函數 / 類模板--模板2
- 數組中的第k個最大的元素--優先級隊列、排序、堆、排序
- 單片機實例27——ADC0809A/D轉換器基本應用技術(硬件電路圖+匯編程序+C語言程序)
- Collection集合的學習
- 一場面試結束,某度員工從事Android 5年為何還是初級工程師?
- 3本書閱讀筆記【人月神話-Go語言實戰-研發能力持續成長路線】01
- PHP垃圾回收機制
- 【電子技術】什麼是LFSR?
- 死鎖?如何定比特到死鎖?如何修複死鎖?(jps和jstack兩個工具)
- 快樂寒假 22/01/20
- image
- 噴程序員?SURE?
- LDO分壓電阻計算小工具
- 面試之求一串字符串中每個字符的出現次數
- 【ISO15765_UDS&OBD診斷】-01-概述
- 【Mysql上分之路】第九篇:Mysql存儲引擎
- RHCE 第一次作業
- 2021.10.16我的第一篇博客:一切皆有可能!
- CTA-敏感行為-讀取IMEI
- 面試被問怎麼排查平時遇到的系統CPU飆高和頻繁GC,該怎麼回答?
- nuxt項目總結-綜合
- 自然語言處理學習筆記(一)
- C語言第一課
- 各比特大佬,Spark的重點難點系列暫時更新完畢
- 基於 esbuild 的 universal bundler 設計
- XCTFre逆向(四):insanity
- 理解什麼是真正的並發數
- JVM腦圖
- 【Pytorch(四)】學習如何使用 PyTorch 讀取並處理數據集
- 函數棧幀的創建與銷毀
- 構建神經網絡- 手寫字體識別案例
- 多模態生成模型ERNIE-VILG
- kotlin不容忽視的小細節
- 備戰一年,終於斬獲騰訊T3,我堅信成功是可以複制的