p.s.最小生成樹,最短路問題,spfa演算法,強連通分量。
鄰接矩陣
時間 **如下
#include
using
namespace std;
int n,m;
// n*n
int graph[
105]
[105];
intmain()
for(
int i=
0;i) cout<}return0;
}
鄰接錶鏈表儲存
遍歷圖最短路
單源最短路
dijkstra 迪傑斯特拉演算法
從所有點中選擇未標記的dis
[i
]dis[i]
dis[i]
值最小的頂點i
ii,將i
ii標記;
鬆弛節點i
ii的相鄰節點
若所有點都被標記,結束。否則回到1
**:
#include
#include
#include
#include
#include
using
namespace std;
int n,m;
// 陣列鍊錶 鄰接表
// 煉表頭 鍊錶節點的下乙個節點 這條邊指向圖中的點 邊的權值
int head[
10005
],nxt[
30005
], ver[
30005
], w[
30005];
int tot;
// 記錄鍊錶節點用了多少個
void
add(
int x,
int y,
int z)
struct nn(
int a=0,
int b=0)
};priority_queue pq;
int d[
10005];
bool vis[
10005
]int
main()
int s=1;
memset
(d,0x3f
,sizeof d)
;// 0x3f3f3f3f
d[s]=0
; pq.
push(n
(s,d[s]);
// pq.push((n));
while
(!pq.
empty()
)}}// d
// d[x] == 0x3f3f3f3f 不連通
return0;
}
spfa
將源點s出隊。
從佇列裡取出頭的點v,用原點到v的當前最短距離來更新源點到與v相鄰的點的最短距離(鬆弛操作)
將最短距離更新過且不在佇列中的點入隊。
回到第二步,直到隊列為空為止。
最小生成樹
kruskal
給所有邊按照邊權從小到大的順序排序;
從小到大依次考慮每條邊(u,v)(最開始沒有任何的邊):
如果u 與v 已經連通了,那麼加入(u,v) 後會出現環,不新增
如果u 與v 沒有連通,那麼加入(u,v) 使其連通
並查集維護連通性。
**如下:
#include
#include
#include
#include
#include
using
namespace std;
int n,m;
int fa[
1000005];
// fa[x] x在並查集樹上的父親是誰
intget
(int x)
void
merge
(int x,
int y)
struct edgeedge[
1000005];
bool
cmp(edge&a,edge&b)
intmain()
sort
(edge+
1,edge+m+
1,cmp)
;int sum =0;
for(
int i=
1;i<=m;i++)}
printf
("%d"
,sum)
;// 貨車運輸
/* for(int i=1;i<=m;i++)
} for(int i=1;i<=m;i++)
} */
return0;
}
清北學堂 2017 10 01
problem 1.alien input file alien.in output file alien.out time limit 1s memory limit 128m 小y 最近正在接受來自x3 星球的外星人的採訪。在那個星球上,每個人的名字都是乙個正整數。所有在這個星球上的居民都是相互...
清北學堂 2017 10 06
因為是剛聽完課所以想把思路記下來,有一些其實也是一知半解的,如果有dalao可以幫忙講解那真是再感謝不過了。還有為什麼我畫圖這麼醜,哇的一下哭出聲 problem a.最佳進製 如今我們最常用的是十進位制,據說這是因為人有十根手指。但事實上這並不是十分方便,10 只有四個因子 1 2 5 10,像 ...
清北學堂 Pa
pa 題目描述 漢諾塔公升級了 現在我們有?個圓盤和?個柱子,每個圓盤大小都不一樣,大的圓盤不能放在小的圓盤上面,個柱子從左到右排成一排。每次你可以將一 個柱子上的最上面的圓盤移動到右邊或者左邊的柱子上 如果移動之後是合法的 話 現在告訴你初始時的狀態,你希望用最少的步數將第?大的盤子移動到第?根 ...