#include<stdio.h> #include<string.h> #include<ctype.h> #include<math.h> #include<iostream> #include<string> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> #include<functional> using namespace std; void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);} #define MS(x,y) memset(x,y,sizeof(x)) #define MC(x,y) memcpy(x,y,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;} template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;} const int N=30000+10,M=150000+10,Z=1e9+7,ms63=1061109567; int casenum,casei; int n,m; int first[N],id; int w[M],c[M],nxt[M]; int f[N]; bool e[N]; void ins(int x,int y,int z) { id++; w[id]=y; c[id]=z; nxt[id]=first[x]; first[x]=id; } struct node { int x,v; node(){} node(int x_,int v_){x=x_;v=v_;} bool operator < (const node& b)const {return v>b.v;} }; priority_queue<node>q; void inq(int x,int v) { if(v>=f[x])return; f[x]=v; q.push(node(x,v)); } void dijkstra() { MS(f,127); inq(1,0); MS(e,0); while(!q.empty()) { int x=q.top().x;q.pop(); if(e[x])continue;e[x]=1; for(int z=first[x];z;z=nxt[z]) { inq(w[z],f[x]+c[z]); } } } const int L=2e7; int Q[L],h,t; void inQ(int x,int v) { if(v>=f[x])return; f[x]=v; if(e[x])return; e[x]=1; Q[t++]=x; } void spfa() { MS(f,127); MS(e,0); h=t=0; inQ(1,0); while(h<t) { int x; if(f[Q[h]]<f[Q[t-1]])x=Q[h++]; else x=Q[--t]; e[x]=0; for(int z=first[x];z;z=nxt[z]) { inQ(w[z],f[x]+c[z]); } } } int main() { while(~scanf("%d%d",&n,&m)) { MS(first,0);id=0; for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); ins(x,y,z); } dijkstra(); //spfa(); printf("%d\n",f[n]); } return 0; } /* 【trick&&吐槽】 1,dijkstra的priority中用pair实现是否可以? 就算可以,也要把pair的权值取负。因为priority默认是大根堆。不满足最短路的要求。 所以还是老老实实写struct吧233 2,不光dijkstra我写错了,连spfa我竟然也给写错了>_< 具体上,出队的标记我给打反了QwQ。细节一定要注意啊! 3,SPFA果然会被卡,这道题就TLE了呢,听说栈写法就可以AC了。 栈写法?唔,干脆每次出队的时候,看看队首队尾哪个距离小就取哪个吧,噗。 然后果然就AC了~ 【题意】 有n个数值,有m个关系。 对于关系(x,y,z),表示v[y]-v[x]<=z。 然后问你,v[n]-v[1]的最大值是多少。 【类型】 差分约束系统 【分析】 什么是差分约束系统呢? 就是我们知道一系列的不等式 {y1-x1<=z1} {y2-x2<=z2} {y3-x3<=z3} 我们想要求出某些点之间的最大差值. 要如何算呢? 以这道入门题为例, 我们直接把(x,y,z)转化为有向边,用其直接建图。 然后以1为起点跑最短路,那么f[n]就是答案。 为什么呢? 因为不等式满足三角关系,而图论中的最短路也与之类似。 我们求1到某个点的最短路,就是这个点距离1的最紧束缚的极限。 所以直接一个最短路算法就能AC这道题。 这道题的限制关系不存在负数,所以不存在负环,用dijkstra或SPFA即可AC */