poj-3159【差分约束+Dijkstra算法的优化】
昨天看图论的时候找到了这么个题目,刚开始不知道查分约束是什么东西,后来在网上学了一下,知道就是求图的最短路径额。。。。。这东西需要好好看看了。
再看这个题目,题意就是给出两点的最大差值,求出1到n的最大差值,刚开始用的一般的方法这个问题超时了,所以用的优先队列,最后ac了。。。(简简单单两行字,这里面全是泪额。。。。。)
上代码。。。。。
#include <iostream> #include <cstdio> #include <queue> #include <vector> #include <cstring> #define Max 0x3f3f3f using namespace std; typedef pair<int,int> P; int d[30005]; int head[30005]; int n,m; int num1,num2,num3; int top; struct node { int value; int to; int next; }x[150010]; void add(int a,int b,int c) { x[top].to=b; x[top].value=c; x[top].next=head[a]; head[a]=top++; } void Init() { top=0; for (int i=1;i<=n;i++) { head[i]=-1; d[i]=Max; } } void Diskj() { d[1]=0; priority_queue<P,vector<P>,greater<P> >que; que.push(P(0,1)); int first,last; while(que.size()) { P p=que.top(); que.pop(); first=p.first; last=p.second; if (d[last]<first)continue; for (int i=head[last];i!=-1;i=x[i].next) { if (d[x[i].to]>x[i].value+d[last]) { d[x[i].to]=x[i].value+d[last]; que.push(P(d[x[i].to],x[i].to)); } } } int z=d[n]; printf("%d\n",z); } int main() { scanf("%d %d",&n,&m); { Init(); while(m--) { scanf("%d %d %d",&num1,&num2,&num3); add(num1,num2,num3); } Diskj(); } }