poj 1201 Intervals 差分约束
2017-01-12 09:48
405 查看
真 .读题杀,英文题一脸懵逼,看来以后还要多读读英文题,不过读完了就能发现这其实是一道很裸的差分约束,按照题意建边即可,但还要注意的就是后一个要大于等于前一个,并且每个位置不能超过一个元素。求一边最大流即可。
#include<cstdio> #include<cstdlib> #include<cmath> #include<ctime> #include<iostream> #include<iomanip> #include<cstring> #include<string> #include<algorithm> #include<queue> using namespace std; int f[100000]; struct bian { int l,r,v; }a[1000000]; int fir[1000000]; int nex[1000000]; int tot=1; int dis[1000000]; bool pd[1000000]; void add_edge(int l,int r,int v) { a[++tot].l=l; a[tot].r=r; a[tot].v=v; nex[tot]=fir[l]; fir[l]=tot; } void spfa() { static queue<int> que; memset(dis,0x8f,sizeof(dis)); que.push(0); dis[0]=0; pd[0]=true; while(!que.empty()) { int u=que.front(); que.pop(); pd[u]=false; for(int o=fir[u];o;o=nex[o]) { if(dis[u]+a[o].v>dis[a[o].r]) { dis[a[o].r]=dis[u]+a[o].v; if(!pd[a[o].r]) pd[a[o].r]=true,que.push(a[o].r); } } } } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int l,r,v; scanf("%d%d%d",&l,&r,&v); add_edge(l,r+1,v); } for(int i=0;i<=50001;i++) { add_edge(i,i+1,0); add_edge(i+1,i,-1); } spfa(); cout<<dis[50001]; return 0; }
相关文章推荐
- poj 1201 intervals 我的第一个差分约束
- poj 1201 Intervals & 1716 Integer Intervals 差分约束
- POJ 1201 & HDU1384 & ZOJ 1508 Intervals 差分约束
- POJ 1201 Intervals || POJ 1716 Integer Intervals 差分约束
- POJ 1201 Intervals 差分约束
- POJ 1201 Intervals || POJ 1716 Integer Intervals 差分约束
- poj 1201/ZOJ 1508 Intervals 差分约束
- POJ 1201 Intervals 差分约束
- POJ 1201 Intervals 差分约束
- POJ 1201 Intervals(差分约束基础)
- POJ 1201 Intervals 差分约束
- poj 1201 Intervals(差分约束求最长路)
- POJ 1201 Intervals
- POJ 1201 Intervals
- poj_1201_Intervals
- poj 1201 Intervals
- POJ 1201 Intervals 已翻译
- POJ 1201 Intervals 差分约束系统
- POJ 1201 Intervals【差分约束】
- POJ 1201 Intervals (差分约束)