题目大意:输入a,b,c三个数,表示b-a<=c。求满足这样的所有条件的,第n个数-第一个数差最大是多少。
思路:显然要用到差分约束,而且是最简单的差分。又因为糖果的个数不可能是负值,所以用dijsktra算法解决即可。
感想:dijsktra模板一定要会用。
代码:
#include<iostream>
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=30000+10;
const int maxm=150000+10;
const int INF=1e9;
struct edge
{
int from,to,dist;
edge(){}
edge(int a,int b,int c):from(a),to(b),dist(c){}
};
struct Heapnode
{
int d,u;
Heapnode(int a,int b):d(a),u(b){}
bool operator<(const Heapnode &b)const
{
return d>b.d;
}
};
struct Dijkstra
{
int n,m;
int head[maxn];
int next[maxm];
int d[maxn];
bool vis[maxn];
edge edges[maxm];
void init(int n)
{
memset(head,-1,sizeof(head));
this->n=n;
m=0;
}
void add_edges(int from,int to,int dist)
{
edges[m]=edge(from,to,dist);
next[m]=head[from];
head[from]=m++;
// cout<<"from:"<<from<<" "<<head[from]<<endl;
}
int dijkstra()
{
priority_queue<Heapnode> Q;
for(int i=0;i<n;i++) d[i]= i==0?0:INF;
memset(vis,0,sizeof(vis));
Q.push(Heapnode(d[0],0));
while(!Q.empty())
{
Heapnode x=Q.top();
Q.pop();
int u=x.u;
if(vis[u]) continue;
vis[u]=true;
for(int i=head[u];i!=-1;i=next[i])
{
edge &e=edges[i];
if(d[e.to]>d[u]+e.dist)
{
d[e.to]= d[u]+e.dist;
Q.push(Heapnode(d[e.to],e.to));
}
}
}
return d[n-1];
}
}DJ;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
DJ.init(n);
while(m--)
{
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
u--,v--;
DJ.add_edges(u,v,d);
}
printf("%d\n",DJ.dijkstra());
return 0;
}