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;
}
分析:差分约束系统基础题,按不等式建图求最短路或最长路径即可。另外这道题用贪心加树状数组应该是更好地解法。
代码:
#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;
}
相关文章推荐
- POJ 1201 Intervals (差分约束系统, 贪心+线段树)
- poj 1201 Intervals(差分约束系统)(中等)
- POJ 2082 Terrible Sets 51nod 1102 面积最大的矩形 《题意好难懂---<贪心+单调栈>》
- POJ1201 Intervals[差分约束系统]
- POJ 1201 Intervals 差分约束系统
- POJ 1201 Intervals (差分约束系统)
- POJ 1201-Intervals(差分约束系统)
- POJ 1201 && HDU 1384 Intervals 差分约束系统
- POJ 1201 Intervals (差分约束系统)
- poj 1201 1716 (贪心+树状数组)
- poj 1201 Intervals(差分约束系统)
- POJ 1201 && HDU 1384 Intervals(差分约束系统)
- [POJ 1201] Intervals (区间贪心选点)
- 【POJ 1201】 Intervals(差分约束系统)
- POJ 1201 Intervals 差分约束系统
- ZOJ 1508 poj 1201 Intervals 差分约束系统
- poj 1201/zoj 1508 intervals 差分约束系统
- POJ 1201 Intervals(差分约束系统)
- 差分约束系统_bellman_ford_poj 1201 Intervals
- POJ -- 1201--Intervals (差分约束系统)