洛谷—— P1260 工程规划

https://www.luogu.org/problem/show?pid=1260

题目描述

造一幢大楼是一项艰巨的工程,它是由n个子任务构成的,给它们分别编号1,2,…,n(5≤n≤1000)。由于对一些任务的起始条件有着严格的限制,所以每个任务的起始时间T1,T2,…,Tn并不是很容易确定的(但这些起始时间都是非负整数,因为它们必须在整个工程开始后启动)。例如:挖掘完成后,紧接着就要打地基;但是混凝土浇筑完成后,却要等待一段时间再去掉模板。

这种要求就可以用M(5≤m≤5000)个不等式表示,不等式形如Ti-Tj≤b代表i和j的起始时间必须满足的条件。每个不等式的右边都是一个常数b,这些常数可能不相同,但是它们都在区间(-100,100)内。

你的任务就是写一个程序,给定像上面那样的不等式,找出一种可能的起始时间序列T1,T2,…,Tn,或者判断问题无解。对于有解的情况,要使最早进行的那个任务和整个工程的起始时间相同,也就是说,T1,T2,…,Tn中至少有一个为0。

输入输出格式

输入格式:

第一行是用空格隔开的两个正整数n和m,下面的m行每行有三个用空格隔开的整数i,j,b对应着不等式Ti-Tj≤b。

输出格式:

如果有可行的方案,那么输出N行,每行都有一个非负整数且至少有一个为0,按顺序表示每个任务的起始时间。如果没有可行的方案,就输出信息“NO SOLUTION”。

输入输出样例

输入样例#1:

5 8
1 2 0
1 5 –1
2 5 1
3 1 5
4 1 4
4 3 –1
5 3 –1
5 4 –3

输出样例#1:

0
2
5
4
1

输入样例#2:

5 5
1 2 –3
1 5 –1
2 5 –1
5 1 –5
4 1 4

输出样例#2:

NO SOLUTION

说明

由@zhouyonglong提供SPJ

差分约束、现学现做。。。

SPFA松弛:

 1 #include <cstring>
 2 #include <cstdio>
 3 #include <queue>
 4
 5 const int N(11110);
 6 int n,m,sumedge,head[N];
 7 struct Edge
 8 {
 9     int v,w,next;
10     Edge(int v=0,int next=0,int w=0):
11         v(v),next(next),w(w){}
12 }edge[52330];
13 inline void ins(int u,int v,int w)
14 {
15     edge[++sumedge]=Edge(v,head[u],w);
16     head[u]=sumedge;
17 }
18
19 int dis[N];
20 bool vis[N];
21 bool SPFA(int u)
22 {
23     vis[u]=1;
24     for(int v,i=head[u];i;i=edge[i].next)
25     {
26         v=edge[i].v;
27         if(dis[v]>dis[u]+edge[i].w)
28         {
29             dis[v]=dis[u]+edge[i].w;
30             if(!vis[v])
31             {
32                 if(!SPFA(v)) return 0;
33             }
34             else return 0;
35         }
36     }
37     vis[u]=0;
38     return 1;
39 }
40
41 #define min(a,b) (a<b?a:b)
42 int AC()
43 {
44     scanf("%d%d",&n,&m);
45     for(int u,v,w,i=1;i<=m;i++)
46         scanf("%d%d%d",&u,&v,&w),ins(v,u,w);
47     for(int i=1;i<=n;i++) ins(0,i,0);
48     memset(dis,127/3,sizeof(dis)); dis[0]=0;
49     if(!SPFA(0))
50     {
51         printf("NO SOLUTION");
52         return 0;
53     }
54     int lose=0x7fffffff;
55     for(int i=1;i<=n;i++) lose=min(lose,dis[i]);
56     for(int i=1;i<=n;i++) printf("%d\n",dis[i]-lose);
57 }
58
59 int Hope=AC();
60 int main(){;}

暴力松弛

 1 #include <cstdio>
 2
 3 int n,m,dis[12120];
 4 struct Edge
 5 {
 6     int u,v,w;
 7 }road[52332];
 8
 9 #define min(a,b) (a<b?a:b)
10 int AC()
11 {
12     scanf("%d%d",&n,&m);
13     for(int u,v,w,i=1;i<=m;i++)
14         scanf("%d%d%d",&road[i].v,&road[i].u,&road[i].w);
15     for(int i=1;i<n;i++)
16         for(int j=1;j<=m;j++)
17             dis[road[j].v]=min(dis[road[j].v],dis[road[j].u]+road[j].w);
18     for(int i=1;i<=m;i++)
19         if(dis[road[i].v]>dis[road[i].u]+road[i].w)
20         {
21             printf("NO SOLUTION");
22             return 0;
23         }
24     int lose=0x7fffffff;
25     for(int i=1;i<=n;i++) lose=min(lose,dis[i]);
26     for(int i=1;i<=n;i++) printf("%d\n",dis[i]-lose);
27     return 0;
28 }
29
30 int Hope=AC();
31 int main(){;}

时间: 2024-10-10 04:07:57

洛谷—— P1260 工程规划的相关文章

洛谷 1260 工程规划 (差分约束)

/* Ti≤Tj+b意味Ti的最大值为Tj+b: Tj≥Ti-b意味Tj的最大值为Ti-b: 因此,根据题中给出的m个不等式,逐步调整各个Ti的最小值和最大值. 设high[i]为Ti当前的最大值,low[i]为Ti当前的最小值. high[j]为Tj当前的最大值,low[j]为Tj当前的最小值. 若high[i]-high[j]>b,则high[i]=high[j]+b(根据Ti≤Tj+b), 若low[i]-low[j]<b,则low[j]=low[i]-b(根据Ti≥Ti-b). 直到出

luogu P1260 工程规划(luogu wa)don&#39;t know way

题目描述 造一幢大楼是一项艰巨的工程,它是由n个子任务构成的,给它们分别编号1,2,…,n(5≤n≤1000).由于对一些任务的起始条件有着严格的限制,所以每个任务的起始时间T1,T2,…,Tn并不是很容易确定的(但这些起始时间都是非负整数,因为它们必须在整个工程开始后启动).例如:挖掘完成后,紧接着就要打地基:但是混凝土浇筑完成后,却要等待一段时间再去掉模板. 这种要求就可以用M(5≤m≤5000)个不等式表示,不等式形如Ti-Tj≤b代表i和j的起始时间必须满足的条件.每个不等式的右边都是一

洛谷P1265 公路修建(Prim)

To 洛谷.1265 公路修建 题目描述 某国有n个城市,它们互相之间没有公路相通,因此交通十分不便.为解决这一“行路难”的问题,政府决定修建公路.修建公路的任务由各城市共同完成. 修建工程分若干轮完成.在每一轮中,每个城市选择一个与它最近的城市,申请修建通往该城市的公路.政府负责审批这些申请以决定是否同意修建. 政府审批的规则如下: (1)如果两个或以上城市申请修建同一条公路,则让它们共同修建: (2)如果三个或以上的城市申请修建的公路成环.如下图,A申请修建公路AB,B申请修建公路BC,C申

[NOI2010] [洛谷P2046] 海拔 [50&#39;]

题目描述 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向 道路连接主干道上两个相邻的交叉路口.下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路.小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向

洛谷 P1948 [USACO08JAN]电话线Telephone Lines

P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncooperative, so he needs to pay for some of the cables required to connect his farm to the phone system. There a

【洛谷P2704【NOI2001】】炮兵阵地

题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格.图上其它白色网格均攻击不到.从图上可见

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的