【POJ 1201】Intervals

 POJ 1201 LOJ   

开始不是很懂为什么对于Xi-Xj≤Ck要跑最短路 后面这句话把我点醒

单源最短路径问题中的三角形不等式。即对有向图中任意一条边 <u,v>都有: dis[v]≤dis[u]+len[u][v],其中 dis[u]dis[u] 和 dis[v]是从源点分别到点u和点v的最短路径的长度,len[u][v]是边 <u,v>的长度值

这道题还要再建边保证s[k]-s[k-1]≥0和s[k]-s[k-1]≤1 

具体看小蓝书叭...

#include<bits/stdc++.h>
using namespace std;
#define Max(x,y) (x)>(y)?(x):(y)
#define Min(x,y) (x)>(y)?(y):(x)
#define ll long long
#define rg register
const int N=5e4+5,M=10000+5,inf=0x3f3f3f3f,P=99999997;
int n,mn=inf,mx=-inf;
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int head[N],tot=0;
struct edge{int v,w,nxt;}e[N*20];
void add(int u,int v,int w){
    e[++tot]=(edge){v,w,head[u]},head[u]=tot;
}

int dis[N];
bool vis[N];
void spfa(int x){
    memset(dis,-inf,sizeof(dis));
    deque<int>q;
    q.push_back(x),vis[x]=1,dis[x]=0;
    while(!q.empty()){
        int u=q.front();
        q.pop_front(),vis[u]=0;
        for(int i=head[u],v,w;i;i=e[i].nxt){
            v=e[i].v,w=e[i].w;
            if(dis[v]<dis[u]+w){
                dis[v]=dis[u]+w;
                if(!vis[v]){
                    if(q.empty()) q.push_back(v);
                    else if(dis[v]>dis[q.front()]) q.push_front(v);
                         else q.push_back(v);
                    vis[v]=1;
                }
            }
        }
    }
}

int main(){
    freopen("in2.txt","r",stdin);
    rd(n);
    for(int i=1,u,v,w;i<=n;++i) rd(u),rd(v),rd(w),add(u-1,v,w),mn=Min(mn,u-1),mx=Max(mx,v);
    for(int i=mn;i<=mx;++i)
    add(i,i+1,0),add(i+1,i,-1);
    spfa(mn);
    printf("%d",dis[mx]);
    return 0;
}
原文地址:https://www.cnblogs.com/lxyyyy/p/11214146.html