`
人生难得糊涂
  • 浏览: 118468 次
社区版块
存档分类
最新评论

poj1364,2983-差分约束系统

 
阅读更多

 poj1364

题目大意:现在假设有一个这样的序列,S={a1,a2,a3,a4...ai...at}
其中ai=a*si,其实这句可以忽略不看
现在给出一个不等式,使得ai+a(i+1)+a(i+2)+...+a(i+n)<ki或者是ai+a(i+1)+a(i+2)+...+a(i+n)>ki
首先给出两个数分别代表S序列有多少个,有多少个不等式
不等式可以这样描述
给出四个参数第一个数i可以代表序列的第几项,然后给出n,这样前面两个数就可以描述为ai+a(i+1)+...a(i+n),即从i到n的连续和,再
给出一个符号和一个ki
当符号为gt代表‘>’,符号为lt代表‘<'
那么样例可以表示
1 2 gt 0
a1+a2+a3>0
2 2 lt 2
a2+a3+a4<2
最后问你所有不等式是否都满足条件,若满足输出lamentable kingdom,不满足输出successful conspiracy,这里要注意了,不要搞反了

 

要注意的一点是差分约束系统的条件是 小于等于。因此样例可以得到如下不等式

s3-s0<0    ----  s3-s0<=-1   (si 表示a1+a2+..ai)

 

#include<iostream>
#include<queue>
using namespace std;
#define MAXSIZE 150
#define INF 9999999
struct node{
	int u;
	int v;
	int c;
};
struct node edges[MAXSIZE];
int head[MAXSIZE];
int next[MAXSIZE];
int vis[MAXSIZE];
int dis[MAXSIZE];
int num;
int n,m;
int c[MAXSIZE];
queue<int>que;
void addnode(int u,int v,int c)
{

	edges[num].u=u;
	edges[num].v=v;
	edges[num].c=c;
	next[num]=head[u];
	head[u]=num++;
}
int spfa(int s)
{
	int i;
	while(!que.empty())
	{
		que.pop();
	}
	memset(vis,0,sizeof(vis));
	memset(c,0,sizeof(c));
	for(i=0;i<=n;i++)
		dis[i]=INF;
	dis[s]=0;
	vis[s]=1;
	c[s]++;
	que.push(s);
	while(!que.empty())
	{
		int from=que.front();
		que.pop();
		vis[from]=0;
		for(i=head[from];i!=-1;i=next[i])
		{
			int to=edges[i].v;
			if(dis[to]>dis[from]+edges[i].c)
			{
				dis[to]=dis[from]+edges[i].c;
				c[to]++;
				if(c[to]>=n+1)
				{
					return 0;
				}
				if(!vis[to])
				{
					vis[to]=1;
					que.push(to); 
				}
			}
		}
	}
	return 1;
}
int main()
{
	//freopen("in.txt","r",stdin);
	while(1)
	{
		scanf("%d",&n);
		if(!n)
			break;
		scanf("%d",&m);
		memset(head,-1,sizeof(head));
		memset(next,-1,sizeof(next));
		num=0;
		while(m--)
		{
			int a,b,k;
			char s[10];
			scanf("%d%d%s%d",&a,&b,s,&k);
			int s1=a-1;
			int s2=a+b;
			if(s[0]=='g')//>
			{
				addnode(s2,s1,-k-1);//这里是-(k-1)
			}
			else 
			{
				addnode(s1,s2,k-1);
			}
		}
		
		int flag=1;
		for(int i=0;i<=n;i++)
			if(!spfa(i))
			{
				flag=0;
				break;
			}
			if(!flag)
				printf("successful conspiracy\n");
			else
				printf("lamentable kingdom\n");
	}
	return 0;
}

 

 

poj2983

#include<iostream>
#include<queue>
using namespace std;
#define EMAX 201010
#define NMAX 1010
#define INF 900000
#define MIN(x,y) (((x)<(y))?(x):(y))
#define MAX(x,y) (((x)>(y))?(x):(y))
int s,e;
int n,m;
int num;
queue<int>que;
struct node
{
	int u;
	int v;
	int c;
};
node edge[EMAX];
int head[EMAX];
int next[EMAX];
int vis[NMAX];
int cans[NMAX];
int dis[NMAX];

void addnode(int u,int v,int c)
{
	edge[num].u=u;
	edge[num].v=v;
	edge[num].c=c;
	next[num]=head[u];
	head[u]=num++;
}

int spfa(int start)
{
	int i;
	while(!que.empty())
	{
		que.pop();
	}
	memset(vis,0,sizeof(vis));
	memset(cans,0,sizeof(cans));
	for(i=s;i<e+1;i++)
	{
		dis[i]=INF;
	}
	dis[start]=0;
	vis[start]=1;
	que.push(start);
	cans[start]++;
	while(!que.empty())
	{
		int from=que.front();
		que.pop();
		vis[from]=0;
		for(i=head[from];i!=-1;i=next[i])
		{
			int to=edge[i].v;
			if(dis[to]>dis[from]+edge[i].c)
			{
				dis[to]=dis[from]+edge[i].c;
				if(!vis[to])
				{
					vis[to]=1;
					que.push(to);
					cans[to]++;
					if(cans[to]>n)
						return 0;
				}
			}
		}
	}
	return 1;
}


int main()
{
//	freopen("in.txt","r",stdin);

	while(scanf("%d%d",&n,&m)!=EOF)
	{
		memset(head,-1,sizeof(head));
		memset(next,-1,sizeof(next));
		
		num=0;
		s=INF;
		e=-INF;
		while(m--)
		{
			char ct;
			int a,b,c;
			//scanf("%c",&ct);
			cin>>ct;
			if(ct=='P')
			{
				scanf("%d%d%d",&a,&b,&c);
				addnode(a,b,c);
				addnode(b,a,-c);
				
				s=MIN(s,a);
				e=MAX(e,b);
			}
			if(ct=='V')
			{
				scanf("%d%d",&a,&b);
				addnode(b,a,-1);
				s=MIN(s,a);
				e=MAX(e,b);
			}
		}
		for (int i =1; i <= n; i++)
			addnode(0, i, 0);
		

		int flag=1;
		if(!spfa(0))
			flag=0;
		if(flag)
			printf("Reliable\n");
		else
			printf("Unreliable\n");

		
			
	}
	return 0;
}
/*
差分约束系统,对于bellman和spfa来说,解差分的不同在于,
对于不连通图bellman能直接处理,而spfa不能,
需要加入超级源(一个到所有点都有一条长度为0的边的点),
并把超级源作为起点,才能保证在扩展过程中到达每个点。
(也可从每个点调用一次spfa来判断是否存在负权环,但这里此题会超时)
否则差分约束系统的部分内容就不会被检测到。
当然也不是所有题遇到这种不连通的情况都可以使用超级源。
因为这种超级源相当于把不同的连通分支在数轴上的起点都平移到了原点。
如题目有特殊要求,则可以对不同的连通分支分别做单独处理。
*/

 

 

 

 

0
0
分享到:
评论

相关推荐

    POJ2983-Is the Information Reliable【差分约束+优化Bellman】

    北京大学在线编程平台上的POJ2983题目——"Is the Information Reliable",是一道涉及差分约束系统(Differential Constraint System)与优化版Bellman算法的典型问题。在本文中,我们将深入探讨这两个概念,并结合...

    POJ 分类题目

    - **定义**:建立和求解差分约束系统。 - **示例题目**: - poj1201 - poj2983 - **应用场景**:适用于资源分配、任务调度等问题。 **4. 最小费用最大流** - **定义**:在图中找到费用最小的最大流。 - **示例...

    poj训练计划.doc

    - 差分约束系统:如`poj1201, poj2983`。 - 最小费用最大流:如`poj2516, poj2195`。 - **数据结构** - 线段树:如`poj2528, poj2828`。 - RMQ(区间查询):如`poj3264, poj3368`。 - 并查集的高级应用:如`...

    POJ1716-Integer Intervals【Difference Constraints】

    1. "POJ1716-Integer Intervals【Difference Constraints】.cpp":这可能是基于差分约束系统理论的C++代码实现,它可能采用了动态规划或者线性规划的方法来解决问题。 2. "POJ1716-Integer Intervals【Greed】.cpp...

    差分约束系统题解1

    【差分约束系统】是一种用于解决一系列线性不等式约束问题的模型,常用于最优化问题,如求解最短路径、最长路径或者判断是否存在满足条件的解。在这个模型中,我们通常需要将问题转化为寻找图中的最短路径或最长路径...

    poj图论题目汇总

    - **知识点**:差分约束系统,一种特殊类型的线性不等式系统,常用于优化问题。 #### 1236 *Network of Schools - 强连通 - **知识点**:强连通分量算法,如Kosaraju算法或Tarjan算法,用于找出图中的强连通分量。...

    poj题目分类

    * 差分约束系统的建立和求解:例如 poj1201、poj2983。 * 最小费用最大流:例如 poj2516、poj2516、poj2195。 * 双连通分量:例如 poj2942。 * 强连通分支及其缩点:例如 poj2186。 * 图的割边和割点:例如 poj...

    很快速的提高算法能力.docx

    - **图算法**:深入学习差分约束系统、最小费用最大流、双连通分量等。 - **数据结构**:掌握线段树、静态二叉检索树、树状数组等高级数据结构。 - **搜索**:进一步学习最优化剪枝和可持久化数据结构。 通过...

    poj各种分类

    在初级阶段的基础上,中级阶段涵盖了更多复杂的数据结构和算法,如差分约束系统、最小费用最大流、双连通分量、强连通分支、最小割模型等,以及线段树、树状数组、RMQ查询等高级数据结构的应用。这些内容进一步深化...

    算法训练方案详解

    - **注意事项**: 理解差分约束系统的构建和求解方法。 **2. 最小费用最大流** - **定义**: 在流量网络中寻找成本最低的最大流。 - **应用场景**: 资源分配问题。 - **示例题目**: POJ 2516, POJ 2195 - **注意...

    acm poj300题分层训练

    3. **图算法的深化**:如差分约束系统、最小费用最大流、双连通分量、强连通分支及其缩点、图的割边和割点、最小割模型等。poj1201、poj2983等涉及这些高级图算法。 4. **高级数据结构**:如线段树、平衡树(Treap、...

    强大的POJ分类——各类编程简单题及其算法分类

    3. **差分约束系统**:建立和求解线性约束问题,如POJ1201和2983。 4. **最小费用最大流**:在考虑费用的情况下寻找最大流,如POJ2516、2195。 5. **双连通分量**:图的结构分析,如POJ2942。 6. **强连通分支和缩点...

    百练POJ 题目分类

    ### 百练POJ题目分类知识点详解 #### 主流算法概览 1. **搜索与回溯** - 搜索算法通常用于解决决策问题,在所有可能的解决方案中找到最佳或满意的结果。 - 回溯法是搜索的一种,主要用于解决约束满足问题。它...

    ACM常用算法及其相应的练习题.docx

    * 差分约束系统的建立和求解 + poj1201, poj2983 * 最小费用最大流 + poj2516, poj2516, poj2195 * 双连通分量 + poj2942 * 强连通分支及其缩点 + poj2186 * 图的割边和割点 + poj3352 * 最小割模型、网络流...

    acm新手训练方案新手必备

    - **高级数据结构**:例如线段树、树状数组、差分约束系统等。 - **字符串算法**:包括后缀数组、AC自动机等。 - **组合优化**:涉及组合优化问题的求解方法。 - **数学建模**:学习如何将实际问题转化为数学模型...

    ACM常用算法及其相应的练习题 (2).docx

    (3) 差分约束系统的建立和求解:poj1201, poj2983 (4) 最小费用最大流:poj2516, poj2516, poj2195 (5) 双连通分量:poj2942 (6) 图的割边和割点:poj3352 七、数学 本部分涵盖了数学,包括组合数学、数论和计算...

    ACM常用算法及其相应的练习题 (2).pdf

    * 差分约束系统的建立和求解:差分约束系统是指用于解决图的约束问题的算法。例题:poj1201、poj2983。 * 最小费用最大流:最小费用最大流是指在流量网络中寻找最小费用最大流的算法。例题:poj2516、poj2516、poj...

    参加ACM大赛应该准备哪些课程? (2).pdf

    6. 差分约束系统 7. Hash表 图论 1. 网络流问题 2. 最小费用流 3. 图的路径问题(0/1边权最短路径、非负边权最短路径) 4. Euler Path/Tour 5. Hamilton Path/Tour 6. 构造生成树问题 7. 最小生成树、第k小生成树...

    ACM北大训练

    - poj1201: 涉及差分约束系统的建立和求解。 ##### 2. 最小费用最大流 - **定义**: 最小费用最大流是在最大流的基础上考虑最小化总成本。 - **应用场景**: 常用于网络流问题、资源分配问题等。 - **示例题目**: -...

    ACM算法总结--最新总结的ACM算法

    3. **差分约束系统**(如poj1195, poj3321):解决变量间的关系约束问题,适用于资源分配、时间表编排等领域。 4. **RMQ(Range Minimum Query)**(如poj3264, poj3368):快速查询区间内的最小值,适用于数据压缩...

Global site tag (gtag.js) - Google Analytics