hdu 1534 Schedule Problem (差分约束)
Schedule Problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1085 Accepted Submission(s): 448
Special Judge
Each project consists the following lines:
the count number of parts (one line) (0 for end of input)
times should be taken to complete these parts, each time occupies one line
a list of FAS, FAF, SAF or SAS and two part number indicates a constrain of the two parts
a line only contains a '#' indicates the end of a project
A blank line should appear following the output for each project.
2
3
4
SAF 2 1
FAF 3 2
#
3
1
1
1
SAF 2 1
SAF 3 2
SAF 1 3
#
0
1 0
2 2
3 1
Case 2:
impossible
- //0MS 248K 1537 B G++
- /*
- 题意:
- 给出完成作业需要的时间,以及它们间完成的先后关系,问是否可行,可行输出每个作业的开始时间
- 差分约束:
- 有n个作业,第 i 个作业所需的时间是 a[i];
- SAS u v 表示 v开始后 u 才能开始;f(u)>=f(v);
- SAF u v 表示 v结束后 u 才能开始;f(u)+a[u]>=f(v);
- FAF u v 表示 v结束后 u 才能结束;f(u)+a[u]>=f(v)+a[v];
- FAS u v 表示 v开始后 u 才能结束;f(u)>=f(v)+a[v]
- 这里使用bellman_ford算法,建立反向边,求最长路径
- */
- #include<stdio.h>
- #include<string.h>
- #define N 1005
- #define inf 0x7ffffff
- struct node{
- int u,v,w;
- }edge[*N];
- int d[N];
- int a[N];
- int n,edgenum;
- bool bellman_ford()
- {
- memset(d,,sizeof(d));
- bool flag=true;
- for(int i=;i<=n;i++){
- if(!flag) break;
- flag=false;
- for(int j=;j<edgenum;j++){
- if(d[edge[j].v]<d[edge[j].u]+edge[j].w){
- d[edge[j].v]=d[edge[j].u]+edge[j].w;
- flag=true;
- }
- }
- }
- return flag; //如果执行n次后还能松弛证明有正权环
- }
- int main(void)
- {
- char opr[];
- int x,y;
- int k=;
- while(scanf("%d",&n),n)
- {
- edgenum=;
- for(int i=;i<=n;i++)
- scanf("%d",&a[i]);
- while(scanf("%s",opr)){
- if(strcmp(opr,"#")==) break;
- scanf("%d%d",&x,&y);
- edge[edgenum].u=y;
- edge[edgenum].v=x;
- if(strcmp(opr,"SAS")==){
- edge[edgenum].w=;
- }
- if(strcmp(opr,"SAF")==){
- edge[edgenum].w=a[y];
- }
- if(strcmp(opr,"FAS")==){
- edge[edgenum].w=-a[x];
- }
- if(strcmp(opr,"FAF")==){
- edge[edgenum].w=a[y]-a[x];
- }
- edgenum++;
- }
- printf("Case %d:\n",k++);
- if(bellman_ford()) puts("impossible");
- else{
- for(int i=;i<=n;i++)
- printf("%d %d\n",i,d[i]);
- }
- printf("\n");
- }
- return ;
- }
再贴一个SPFA的:
- //218MS 456K 1791 B G++
- #include<iostream>
- #include<vector>
- #include<queue>
- #define N 1005
- #define inf 0x7ffffff
- using namespace std;
- struct node{
- int v,w;
- node(int a,int b){
- v=a;w=b;
- }
- };
- vector<node>V[N];
- int a[N];
- int d[N],in[N],vis[N];
- int n;
- bool spfa()
- {
- memset(in,,sizeof(in));
- memset(vis,,sizeof(vis));
- for(int i=;i<=n;i++) d[i]=-inf;
- queue<int>Q;
- Q.push();
- vis[]=;
- in[]=;
- d[]=;
- while(!Q.empty()){
- int u=Q.front();
- Q.pop();
- if(in[u]>n) return false;
- vis[u]=;
- int n0=V[u].size();
- for(int i=;i<n0;i++){
- int v=V[u][i].v;
- int w=V[u][i].w;
- if(d[v]<d[u]+w){
- d[v]=d[u]+w;
- if(!vis[v]){
- in[v]++;
- Q.push(v);
- vis[v]=;
- }
- }
- }
- }
- return true;
- }
- int main(void)
- {
- string opr;
- int x,y;
- int k=;
- while(cin>>n)
- {
- if(!n) break;
- for(int i=;i<=n;i++) V[i].clear();
- for(int i=;i<=n;i++){
- cin>>a[i];
- V[].push_back(node(i,));
- }
- while(cin>>opr){
- if(opr=="#") break;
- cin>>x>>y;
- if(opr=="SAS") V[y].push_back(node(x,));
- if(opr=="SAF") V[y].push_back(node(x,a[y]));
- if(opr=="FAS") V[y].push_back(node(x,-a[x]));
- if(opr=="FAF") V[y].push_back(node(x,a[y]-a[x]));
- }
- cout<<"Case "<<k++<<":"<<endl;
- if(!spfa()) cout<<"impossible"<<endl;
- else{
- for(int i=;i<=n;i++)
- cout<<i<<" "<<d[i]<<endl;
- }
- cout<<endl;
- }
- return ;
- }
hdu 1534 Schedule Problem (差分约束)的更多相关文章
- HDOJ 1534 Schedule Problem 差分约束
差分约数: 求满足不等式条件的尽量小的值---->求最长路---->a-b>=c----> b->a (c) Schedule Problem Time Limit: 2 ...
- HDU 3666 THE MATRIX PROBLEM (差分约束)
题意:给定一个最大400*400的矩阵,每次操作可以将某一行或某一列乘上一个数,问能否通过这样的操作使得矩阵内的每个数都在[L,R]的区间内. 析:再把题意说明白一点就是是否存在ai,bj,使得l&l ...
- hdu 1531 king(差分约束)
King Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU3666 THE MATRIX PROBLEM (差分约束+取对数去系数)(对退出情况存疑)
You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...
- HDU3666-THE MATRIX PROBLEM(差分约束-不等式解得存在性判断 对数转化)
You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...
- hdu 1384 Intervals (差分约束)
Problem - 1384 好歹用了一天,也算是看懂了差分约束的原理,做出第一条查分约束了. 题意是告诉你一些区间中最少有多少元素,最少需要多少个元素才能满足所有要求. 构图的方法是,(a)-> ...
- hduTHE MATRIX PROBLEM(差分约束)
题目请戳这里 题目大意:给一个n*m的矩阵,求是否存在这样两个序列:a1,a2...an,b1,b2,...,bm,使得矩阵的第i行乘以ai,第j列除以bj后,矩阵的每一个数都在L和U之间. 题目分析 ...
- HDU 1384 Intervals【差分约束-SPFA】
类型:给出一些形如a−b<=k的不等式(或a−b>=k或a−b<k或a−b>k等),问是否有解[是否有负环]或求差的极值[最短/长路径].例子:b−a<=k1,c−b&l ...
- ZOJ 1455 Schedule Problem(差分约束系统)
// 题目描述:一个项目被分成几个部分,每部分必须在连续的天数完成.也就是说,如果某部分需要3天才能完成,则必须花费连续的3天来完成它.对项目的这些部分工作中,有4种类型的约束:FAS, FAF, S ...
随机推荐
- SpringBoot学习13:springboot异常处理方式3(使用@ControllerAdvice+@ExceptionHandle注解)
问题:使用@ExceptionHandle注解需要在每一个controller代码里面都添加异常处理,会咋成代码冗余 解决方法:新建一个全局异常处理类,添加@ControllerAdvice注解即可 ...
- Oracle 的jdbc方法
package com.swift.jdbc_oracle; import java.sql.CallableStatement; import java.sql.Connection; import ...
- Linux - bashrc之alias
1. cd ~ 2. touch .bashrc // 若该文件不存在的话 3. vim .bashrc ----------------复制粘贴如下文本--------------- # alias ...
- CentOS 6.5通过yum安装 MySQL-5.5
1.安装mysql-5.5的yum源 rpm -ivh http://repo.mysql.com/yum/mysql-5.5-community/el/6/x86_64/mysql-communit ...
- 想学习一下node.js,重新安装配置了node
根据这个网站上的教程安装配置的,还不错一次就成功了.觉得安装没什么,就是配置路径的时候容易错. http://www.runoob.com/nodejs/nodejs-install-setup.ht ...
- 在Ubuntu下安装gcc编译器+测试
1.输入命令: sudo apt-get install gcc libc6-dev 2.创建文件hello.c使用命令: touch hello.c 3.在hello.c中写入: #include ...
- 小明的存钱计划 南阳acm54
小明的存钱计划 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 小明的零花钱一直都是自己管理.每个月的月初妈妈给小明300元钱,小明会预算这个月的花销,并且总能做到实际花 ...
- C——可变参数
1.要学可变参数,需要先了解C编译器对栈的管理 做个实验可以得到 #include <stdio.h> void func(int a, char b, int c, int d) { i ...
- POJ:2100-Graveyard Design(尺取)
Graveyard Design Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 8504 Accepted: 2126 Cas ...
- PHP.15-mysqli
从PHP5.0开始可以使用mysql(i), 是一个面向对象的技术(新加功能都会以对象形式添加) i:表示改进,1. 功能增加了, 2,效率大大增加(以后的PHP项目改成mysqli),3,更稳定 m ...