離散化 拓撲排序 最短路堆優化

2021-10-22 16:18:33 字數 3392 閱讀 8617

資料範圍太大,自身無法作為陣列的下標儲存對應的屬性,當資料至於他們之間的相對大小有關,而與具體值無關時,則可以進行離散化。

做法:不改變資料相對大小的前提下,對資料進行縮小

struct node 

a[100001

];從小到大排序

b[100001

]for(i=

1;i<=n;i++

) b[a[i]

.order]

=i;

鄰接表:

struct edge

vector map[

10005];

for(

int i=

0;i<

10005

;i++

)map[i]

.clear()

;for

(int k=

0;k.size()

;k++

)

採用優先佇列優化,也就時堆優化。採用鄰接表儲存圖,利用優先佇列維護每乙個結點的dist值,避免了每次從n個節點找乙個最優解。

1000以上的資料量大小,一般採用此方法。

改進時間複雜度。

#define inf 21478483657

using

namespace std;

int n,m,s;

int cnt,head[

10005];

int dist[

10005

],vis[

10005];

struct edgeedge[

2000005];

void

add_edge

(int from,

int to,

int w)

struct node

void

dij())

;for

(int i=

1;i<=n;i++

) dist[s]=0

;while

(!q.

empty()

));}

}}}

題目**:

#include

#include

#include

using

namespace std;

int n;

int degree[

501]

;int q[

501]

;int head[

501]

;struct node

ans[

501]

;voidf(

)}q[k++

]=t;

// 記錄入度點

degree[t]=-

1;// 去掉該點

for(

int l=head[t]

;l!=-1

;l=ans[l]

.next)

degree[ans[l]

.to]--;

// 從該點出發到達的點,他們要減小入度

}for

(int i=

0;i1;i++

) cout << q[n-1]

<< endl;

}int

main()

f();

}return0;

}

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1e4+5;

const

int emaxn=

2e4+10;

int head[maxn]

,edge[emaxn]

,next[emaxn]

,k;int node[maxn]

,degree[maxn]

,n,m,a,b;

priority_queue<

int> q;

void

add(

int a,

int b)

intmain()

ans+

=node[t];}

if(cnt) cout<<

"-1\n"

;else cout<(long

long

)n*888

<<

"\n"

;memset

(head,0,

sizeof

(head));

memset

(edge,0,

sizeof

(edge));

memset

(next,0,

sizeof

(next));

memset

(node,0,

sizeof

(node));

memset

(degree,0,

sizeof

(degree)

); k=0;

}}

#include

#include

#include

#include

#define inf 214784836

using

namespace std;

const

int n=4*

1e5+5;

long

long

int n,m,s;

long

long

int cnt,head[n]

;long

long

int dist[n]

,vis[n]

;struct edge

edge[n]

;void

add(

long

long from,

long

long to,

long

long w)

void

dij()}

}}void

init()

intmain()

dij();

cout<;for

(int i=

2;i<=n;i++

)printf

(" %lld"

,dist[i]);

puts(""

);}}

dij最短路 堆優化

dij乙個主要思路,將所有點分為兩個集合s,t,初始集合s中只包含了起點,t集合包含所有點,要做的就是從t集合中不斷選取與s集合中的點距離最短的並且未被加入s集合中的點,將這個點加入s集合,並用這個點去更新所有與這個點相鄰的點,重複操作直到所有點都被加入s集合中。下面看一下dij的過程 dij演算法...

最短路模板 堆優化dijstra spfa

最短路模板 輸入 n m s t 接下來m行 u,v,w表示u v 有一條權值為w的無向邊 input 3 3 1 2 1 2 3 2 3 4 1 3 5 output 3 include using namespace std define fi first define se second de...

模版 堆優化Dijkstra求最短路

一 堆優化的主要思想就是使用乙個優先佇列 就是每次彈出的元素一定是整個佇列中最小的元素 來代替最近距離的查詢,用鄰接表代替鄰接矩陣,這樣可以大幅度節約時間開銷。幾個細節 優先佇列的資料型別 優先佇列應該用於快速尋找距離最近的點。由於優先佇列只是將最小的那個元素排在前面,因此應該定義一種資料型別,使得...