【题目链接】
http://poj.org/problem?id=3159
题目意思
一群小朋友分糖,但是不同小朋友乖巧程度不一样,所以分的糖不一样。但是小朋友A虽然认为自己不如小朋友B,但是他觉的差距只值C个糖。不然他要他要找校长(现在小孩真凶残,直接找校长了),问你为了区分不同小朋友的乖巧程度尽可能让区间大,问你最大是多少。
解题思路
最基础的差分约束,不用管图是否有负环是否能连通(题目给的意思注定连通,不会有负环)。把A - B >= w转换成路径就好了。
代码部分
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <string>
#include <map>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3f
const int N = 1e5+5;
int dis[N]; ///存储正向最短路
int vis[N]; ///记录是否在队列
int m,n;
struct node
{
int v;
int w;
friend bool operator < (node a,node b)
{
return a.w>b.w;
}
}s;
vector<vector<node> >M(N);
void init ()
{
for (int i = 1; i <= n; i++)
{
M[i].clear();
dis[i] = inf;
vis[i] = 0;
}
}
node add (int v,LL w) ///转换成node类型
{
node t;
t.v = v;
t.w = w;
return t;
}
void spfa()
{
priority_queue<node>q;
q.push(add(1,0));
vis[1] = 1;
dis[1] = 0;
while (!q.empty())
{
node t = q.top();
q.pop();
for (int i = 0; i < M[t.v].size();i++)
{
s = M[t.v][i];
if (dis[s.v] > dis[t.v]+s.w) ///松弛
{
dis[s.v] = dis[t.v]+s.w;
if (!vis[s.v]) ///判断是否在队列
{
q.push(add(s.v,dis[s.v])); ///按dis最小的优先出队
vis[s.v] = 1;
}
}
}
vis[t.v] = 0;
}
}
int main()
{
while (~scanf("%d %d",&n,&m))
{
init();
for (int i = 0; i < m; i++)
{
int v,u,w;
scanf("%d %d %d",&u,&v,&w);
M[u].push_back(add(v,w));
}
spfa();
cout<<dis[n]<<endl;
}
return 0;
}