POJ 3159 Candies(差分约束)

【题目链接】
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;
} 

猜你喜欢

转载自blog.csdn.net/pashuihou/article/details/80085265