BOJ 333 最小生成樹 最短路

2021-08-26 18:27:40 字數 1757 閱讀 1075

很裸的乙個題吧,就是先求出乙個最小生成樹,然後求的同時把圖給建好,然後列舉起點,求最短路。因為在樹上求最短路必然是o(n)的,所以總的複雜度是o(n2)的

求最短路的時候囧了,直接寫的spfa,其實直接bfs就行了。不過明顯寫spfa寫習慣了。

當然這道題卡人的地方很猥瑣,是精度。

用double竟然精度都不夠,很詫異啊,然後經指點才知道,題目說最多有兩位小數,直接放大100倍成long long型別的就行了,而且不能用double直接乘100,會掛,可以用字串讀入,然後處理,或者加個eps,然後輸出的時候也沒什麼要求,其實就三種情況,整數,1個小數,二個小數。判斷一下就行了。

/*

id: sdj22251

prog: inflate

lang: c++

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 1105

#define inf 10000000000000000ll

#define l(x) x<<1

#define r(x) x<<1|1

#define pi acos(-1.0)

#define eps 1e-7

using namespace std;

long long dis[maxn][maxn];

long long lowcost[maxn], d[maxn];

int nearvex[maxn], head[maxn], vis[maxn], q[maxn * maxn];

int n, m, e;

struct node

edge[2 * maxn * maxn];

void insert(int x, int y, long long w)

void spfa(int src)}}

}}void out(long long x)

void prim(int u)

nearvex[u] = -1;

for(int i = 1; i < n; i++)

}if(v != -1)}}

}out(sumweight);

}long long in(char *s)

}int cnt = len - 1 - id;

for(int i = 0; i < 2 - cnt; i++)

s[len++] = '0';

long long sum = 0;

for(int i = 0; i < len; i++)

return sum;

}int main()

prim(1);

long long mi = inf;

int pos = 1;

for(int i = 1; i <= n; i++)

if(sum < mi)

}mi *= 2;

cout << pos << " ";

out(mi);

printf("\n");

//printf("%d %f\n\n", pos, mi * 2);}}

return 0;

}

最短路徑 最小生成樹

題目描述 n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 輸入描述 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號 輸出描述 n 1行,表示0號城市到其他城...

最短路徑 最小生成樹

今天覆習的時候,剛好複習的這一塊,所以就簡單做乙個備忘,寫的潦草還望大家不要介意呀 1 dijistra演算法 思路 根據點集合將其分為兩個集合,一種是已經訪問過的點s集合 代表從源點到該集合中的點的距離最小 另一種是未訪問過的u集合,然後每次從u集合中選擇節點,使得源點到改點的距離最小,並新增進s...

7 11最小生成樹 最短路

其實這一部分的知識在前面我也算是學了一些了,今天老師講的是一些應用部分,結果我發現自己一臉懵逼,有些題我甚至連這是最短路都沒有看出來。看來還並沒有修煉到一定的水準,並且我還是發現一些自己還沒有學習過的知識,下面我們就先從鏈式前向星開始說起。首先我們就來介紹一下這個東西是個什麼。圖的儲存一般有兩種 鄰...