POJ_3159_(数组模拟邻接表)
- 题意:题目告诉我们求点1和点n之间在满足约束条件
dist[a]+c>=dist[b]
时的最大差值, - 假设三角形
abc
,起点是a
,a->b(2)
a->c(4)
b->c(3)
,当a
点糖果数是0
时,如果走a->b->c
得到c
糖果数为5
,不满足a->c(4)
的要求,所以转换为有向图,求最短路 vector
邻接表不行,用数组模拟邻接表1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53#include <iostream>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 150005;
int n,m;
bool vis[maxn];
int dist[maxn];
int tot;
int ver[maxn];
int edge[maxn];
int head[maxn];
int next[maxn];
void add(int x,int y,int z) {
ver[++tot] = y;edge[tot] = z;
next[tot] = head[x]; head[x] = tot;
}
void dij() {
memset(dist,0x3f,sizeof dist);
memset(vis,0,sizeof vis);
priority_queue<pair<int,int> > que;
dist[1] = 0;
que.push( make_pair(-dist[1],1) );
while (!que.empty()) {
int cur = que.top().second; que.pop();
if (vis[cur]) continue;
vis[cur] = 1;
for (int i = head[cur]; i; i=next[i]) { //扫描所有的出边,head[i]数组存的是点i的第一条边,
int to = ver[i];
int div = edge[i];
if (dist[to] > dist[cur] + div) {
dist[to] = dist[cur] + div;
que.push( make_pair(-dist[to],to) );
}
}
}
}
int main() {
// freopen("a.txt","r",stdin);
scanf("%d%d",&n,&m);
int u,v,w;
for (int i=1; i<=m; i++) {
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dij();
cout << dist[n] << endl;
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!