poj 1201(and)1716 (差分约束系统的建立和求解--其实也是spfa)
来源:互联网 发布:网络服务器 书籍 编辑:程序博客网 时间:2024/06/05 04:06
这题好。
题意:给n个区间中至少需要取Ci个数。求出满足n个条件的集合C的最少的元素个数.
转载结题报告:
题目中的条件可以表示成S[bi+1]>=S[ai]+Ci//至少要Ci个。
这与spfa中的松弛操作时很像的。因此可以看成一些点有D[v]>=D[u]+w(u,v)上式对任何u成立,所以v应该是里面最大的,若D[v]<D[u]+w(u,v)则D[v]=D[u]+w(u,v)于是。可以从ai和bi+1连一条线,它的长度是ci。
这里只有这些条件还是不够的,还要加上两个使其满足整数性质条件1>=s[i+1]-s[i]>=0有了这么多条件,使其自然构成了一个差分约束系统。用spfa算法得到一个最长路,第一个到最后一个节点的最长路即是需要求的值。
根据条件:1>=s[i+1]-s[i]>=0.在i和i+1建立权值为0,i和i-1建立权值为-1;
#include <iostream>
#include <queue>
#include <set>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
const int INF=99999999;
struct node
{
int v;
int w;
};
int n;
vector<node>vv[50001];//存储有向和无向图的比较方便的方法
int dist[50001];
int MIN=500090;
int MAX=-1;
int vis[50003];
void spfa()//模型就是以MIN位原点的最长路
{
memset(vis,0,sizeof(vis));
queue<int>qu;
vis[MIN]=1;
dist[MIN]=0;
qu.push(MIN);
while(!qu.empty())
{
int top=qu.front();
qu.pop();
vis[top]=0;
for(int i=0;i<vv[top].size();i++)
{
if(dist[vv[top][i].v]<dist[top]+vv[top][i].w)//松弛
{
dist[vv[top][i].v]=dist[top]+vv[top][i].w;
if(!vis[vv[top][i].v])
{
vis[vv[top][i].v]=1;
qu.push(vv[top][i].v);
}
}
}
}
}
int main()
{
scanf("%d",&n);
int u,v,c;
node newone;
for(int i=0;i<n;i++)
{
scanf("%d%d",&u,&v);
v++;
MIN=min(MIN,u);
MAX=max(MAX,v);
newone.v=v;
newone.w=2;
vv[u].push_back(newone);
}
for(int i=MIN;i<=MAX;i++)
{
node tmp;
tmp.v=i+1;
tmp.w=0;
vv[i].push_back(tmp);
tmp.v=i;
tmp.w=-1;
vv[i+1].push_back(tmp);
}
for(int i=MIN;i<=MAX;i++)
{
dist[i]=-INF;//求最长路嘛,就是初始化无穷小的
}
spfa();
cout<<dist[MAX]<<endl;
return 0;
}
- poj 1201(and)1716 (差分约束系统的建立和求解--其实也是spfa)
- 【POJ 1275】 Cashier Employment(差分约束系统的建立和求解)
- POJ 1201 浅谈拟构限制SPFA求解差分约束系统
- POJ 3159 差分约束系统+spfa
- POJ 3169 差分约束系统 + spfa
- poj 1201 Intervals(最短路+spfa+差分约束系统)
- POJ 1201 Interval (Spfa 差分约束系统)
- POJ 2983 (差分约束系统Spfa)
- poj 1716 poj 1201 差分约束+SPFA
- POJ-2983 用SPFA求解差分约束..
- POJ-1716 同上..SPFA差分约束..
- POJ 1716 差分约束 SPFA
- POJ 1201 Intervals 差分约束+spfa
- poj 1201 Intervals 差分约束 + spfa
- POJ 1201 SPFA 差分约束
- poj 1201-差分约束+spfa
- poj 1201 Intervals 差分约束+spfa
- poj 1201 差分约束+SPFA
- Eclipse下Android开发的快捷键
- 如何发送一个指令给另外一个进程[进程通信2]
- CDEFINES用于定义C语言使用的宏定义
- C语言中time_t数据类型详细介绍
- javascript
- poj 1201(and)1716 (差分约束系统的建立和求解--其实也是spfa)
- CE BSP开发入门(1)
- android 图像处理滤镜系列
- CE BSP开发入门(2)
- Ubuntu 11.10编译Android 错误
- 解决在SQL server 2000中病毒时遇到的Microsoft SQL-DMO(ODBC SQLState :42000)问题
- Linux下,DIY apache和memcache守护进程
- VC操作注册表函数
- 程序员的7个坏习惯来源: 开源中国社区 发布时间: 2012-06-03 08:38 阅读: 5543 次 原文链接 全屏阅读 [收藏]