题意:
给出两点的最大差值,求出1到n的最大差值
思路:
其实就是求1-n的最短路
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxn = 30000+5;
const int maxm = 150000+5;
using namespace std;
int n,m;
int head[maxn], cur;
struct Edge{
int v,w,next;
};
Edge edges[maxm];
void init(int a){
for(int i = 0; i <= a; ++i) head[i] = -1;
cur = 0;
}
void addEdge(int u, int v, int w){
edges[cur].v = v; edges[cur].w = w;
edges[cur].next = head[u]; head[u] = cur++;
}
int d[maxn];
bool vis[maxn];
struct Node{
int u,d;
Node(int a, int b):u(a),d(b){}
bool operator < (const Node& rhs) const{
return d > rhs.d;
}
};
int Dijkstra(int s, int t){
for(int i = 1; i <= n; ++i) { d[i] = INF; vis[i] = 0; }
d[s] = 0;
priority_queue<Node> Q;
Q.push(Node(s, 0));
while(!Q.empty()){
Node t = Q.top(); Q.pop();
int u = t.u;
if(vis[u]) continue;
vis[u] = 1;
for(int i = head[u]; i != -1; i = edges[i].next){
int v = edges[i].v, w = edges[i].w;
if(d[v] > d[u] + w){
d[v] = d[u] + w;
Q.push(Node(v, d[v]));
}
}
}
return d[t];
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m) == 2){
init(n);
for(int i = 0; i < m; ++i){
int a,b,c; scanf("%d%d%d", &a,&b,&c);
addEdge(a, b, c);
}
printf("%d\n", Dijkstra(1,n));
}
fclose(stdin);
return 0;
}