您的位置:首页 > 其它

POJ 1201 Intervals <差分约束系统 + SPFA / 贪心 + 树状数组>

2017-04-26 21:58 295 查看
题目:传送门

分析:差分约束系统基础题,按不等式建图求最短路或最长路径即可。另外这道题用贪心加树状数组应该是更好地解法。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;

const int MAXN=50005;
const int INF=0x3f3f3f3f;
int n,cnt=0;
queue<int> Q;
int head[MAXN],dis[MAXN];
int _min=INF,_max=-INF;
struct EDGE{
int v,w,next;
};
EDGE edge[3*MAXN];
bool vis[MAXN];

void addEdge(int u,int v,int w){
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}

int SPFA(){
memset(vis,false,sizeof vis);
dis[_min]=0;
for(int i=_min+1;i<=_max;++i){
dis[i]=-INF;
}
Q.push(_min);
while(!Q.empty()){
int x=Q.front(); Q.pop();
vis[x]=false;
for(int i=head[x];i!=-1;i=edge[i].next){
int v=edge[i].v;
if(dis[v]<dis[x]+edge[i].w){
dis[v]=dis[x]+edge[i].w;
if(!vis[v]){
vis[v]=true;
Q.push(v);
}
}
}
}
return dis[_max];
}

int main(){
ios::sync_with_stdio(false);
cin>>n;
memset(head,-1,sizeof head);
while(n--){
int a,b,c;
cin>>a>>b>>c;
addEdge(a,b+1,c);
_min=min(_min,a);
_max=max(_max,b+1);
}
for(int i=_min;i<_max;++i){
addEdge(i,i+1,0);
addEdge(i+1,i,-1);
}
cout<<SPFA()<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: