資料範圍太大,自身無法作為陣列的下標儲存對應的屬性,當資料至於他們之間的相對大小有關,而與具體值無關時,則可以進行離散化。
做法:不改變資料相對大小的前提下,對資料進行縮小
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求最短路
一 堆優化的主要思想就是使用乙個優先佇列 就是每次彈出的元素一定是整個佇列中最小的元素 來代替最近距離的查詢,用鄰接表代替鄰接矩陣,這樣可以大幅度節約時間開銷。幾個細節 優先佇列的資料型別 優先佇列應該用於快速尋找距離最近的點。由於優先佇列只是將最小的那個元素排在前面,因此應該定義一種資料型別,使得...