poj1201 差分约束 线段类的

来源:互联网 发布:java编程视频 编辑:程序博客网 时间:2024/06/02 19:05

注意点一:大的要+1。

注意点二:相邻的两个数之间要建边,双向的!值还不一样

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>


using namespace std;
const int maxn = 50000 + 100;
const int maxm = 500000 + 100;
const int INF = 1e8;


int head[maxn], tot;


struct Edge{
int to, w, next;
}edge[maxm];


void init(){
tot = 0;
memset(head, -1, sizeof head );
}


void addedge(int u, int v, int w){
edge[tot].to = v;
edge[tot].w = w;
edge[tot].next = head[u];
head[u] = tot++;
}


int d[maxn];
bool vis[maxn];
queue<int> q;
int Mn, Mx;


int spfa(){
int s = Mn;
while(!q.empty()) q.pop(); 
for(int i=Mn; i<=Mx; ++i) d[i] = -INF;
memset(vis, false, sizeof vis );
q.push(s); d[s] = 0; vis[s] = true;
while(!q.empty()){
int u = q.front(); q.pop();
vis[u] = false;
for(int i=head[u]; ~i; i=edge[i].next){
int &v = edge[i].to;
int &w = edge[i].w;
if(d[v] < d[u] + w){
d[v] = d[u] + w;
if(!vis[v]){
vis[v] = true;
q.push(v);
}
}
}
}
return d[Mx];
}


int main()
{
int n, u, v, w;
init();
scanf("%d", &n);
Mn = INF, Mx = -INF;
for(int i=0; i<n; ++i){
scanf("%d%d%d", &u, &v, &w);
addedge(u, v+1, w);
Mn = min(Mn, u);
Mx = max(Mx, v+1);
}
for(int i=Mn; i<Mx; ++i){
addedge(i, i+1, 0);
addedge(i+1, i, -1);
}
printf("%d\n", spfa());
return 0;
}
原创粉丝点击