HDU 4966 GGS-DDU

news/2025/3/21 13:20:50/

题意:

你有n个课程  每个课程有一个规定的毕业学分  修学分有m种方式  每种方式要求先修到x课程x'学分以上才能花费money去修y课程并且将学分修到y'  问  最少花费多少可以毕业

思路:

一开始想费用流  建完图发现一个问题解决不掉  那就是  一条边如果流过多次怎样才能让费用只计算一次  所以换思路

我们知道  为了应付“ 学分修到y' ”这个条件  高层学分一定要“覆盖”低层学分  那么就想到以每个学分为一个点  高层向低层连边  费用为0  同时修学分的方式是输入的  直接建边  费用为输入费用  一开始只能走到0学分  所以超级源点向所有0学分连边  费用0  那么此时我们想要的是从源点花最小费用走到所有点  这就是有向图最小生成树  即最小树形图

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define M 610
#define inf 2000000000int n, m, ans, tot, S;
int head[M], id[M], in[M], pre[M], vis[M], node[M][M], s[M];
struct ed {int u, v, w, next;
} ed[M * M];int ZL(int root, int V, int E) {int ret = 0;for (;;) {for (int i = 0; i < V; i++) {id[i] = -1;vis[i] = -1;in[i] = inf;}for (int i = 0; i < E; i++) {int u = ed[i].u;int v = ed[i].v;if (ed[i].w < in[v] && u != v) {pre[v] = u;in[v] = ed[i].w;}}for (int i = 0; i < V; i++) {if (i == root)continue;if (in[i] == inf)return -1;}int cnt = 0;in[root] = 0;for (int i = 0; i < V; i++) {ret += in[i];int v = i;while (vis[v] != i && id[v] == -1 && v != root) {vis[v] = i;v = pre[v];}if (v != root && id[v] == -1) {for (int u = pre[v]; u != v; u = pre[u])id[u] = cnt;id[v] = cnt++;}}if (cnt == 0)break;for (int i = 0; i < V; i++)if (id[i] == -1)id[i] = cnt++;for (int i = 0; i < E; i++) {int u = ed[i].u;int v = ed[i].v;ed[i].u = id[u];ed[i].v = id[v];if (id[u] != id[v])ed[i].w -= in[v];}V = cnt;root = id[root];}return ret;
}void add(int U, int V, int W) {ed[tot].u = U;ed[tot].v = V;ed[tot].w = W;ed[tot].next = head[U];head[U] = tot++;
}int main() {int i, j, k, u, v, tmp;while (scanf("%d%d", &n, &m) != EOF) {if (!n && !m)break;k = 0;for (i = 1; i <= n; i++) {scanf("%d", &s[i]);for (j = 0; j <= s[i]; j++)node[i][j] = k++;}S = k++;tot = 0;memset(head, -1, sizeof(head));for (i = 1; i <= n; i++) {add(S, node[i][0], 0);for (j = 1; j <= s[i]; j++)add(node[i][j], node[i][j - 1], 0);}for (i = 1; i <= m; i++) {scanf("%d%d", &u, &v);tmp = node[u][v];scanf("%d%d", &u, &v);v = node[u][v];u = tmp;scanf("%d", &tmp);add(u, v, tmp);}ans = ZL(S, k, tot);printf("%d\n", ans);}return 0;
}



http://www.ppmy.cn/news/928272.html

相关文章

将安装包 ggs_Adapters_Linux_x64.tar 在主机的 GG_HOME 下解压,环境变量GG_HOME没有目录

背景&#xff1a;我在做项目练习的时候&#xff0c;目标端 GoldenGate 安装时需要在主机的 GG_HOME 下解压安装包 第一反应是环境变量没有生效 在root下source $GG_HOME 使其生效&#xff0c;然后重启重新登陆 一般就能解决 在我这里他没有解决 echo $GG_HOME是好的 那就…

ORA-1653: unable to extend table GGS.GGS_DDL_HIST

1.表GGS_DDL_HIST由来 这张表是在GLOBALS里面参数DDLTABLE指定的&#xff0c;若是没有指定默认就是这个表名GGS_DDL_HIST 此表记录了被goldengate处理过的DDL&#xff0c;也就是通过goldengate同步到对端的DDL GGSCI (TEST)> EDIT PARAMS ./GLOBALS DDLTABLE GGS_DDL_HIS…

win7系统oracle搭建ogg,OGG_windows搭建实验

windows卸载Oracle GoldenGate产品的方法 1、进入源或目标GG配置目录&#xff0c;输入以下命令&#xff1a; gg> stop * gg> stop mgr 2、删除Oracle GoldenGate目录 3、运行windows命令&#xff0c;执行sc delete [服务名] 此服务器名就是./GLOBALS中的MGRSERVNAME ggsc…

【HDU4966】GGS-DDU

题意 有n种科目&#xff0c;每个科目都有一个最高的等级a[i]。开始的时候&#xff0c;每个科目的等级都是0。现在要选择一些课程进行学习使得每一个科目都达到最高等级。这里有m节课可供选择。对于每门课给出L1[i],c[i],L2[i],d[i]&#xff0c;money[i]&#xff0c;要选择这门课…

HDU 4966 GGS-DDU [最小树形图]

题意 一共有n门课&#xff0c;每门课有a[i]个阶段&#xff0c;一开始每门课都在第0个阶段&#xff0c;我们需要到达所有课的最高的阶段&#xff0c;现在有m个培训班&#xff0c;每个培训班需要c[i]课程满足所在阶段大于等于l1&#xff0c;那么就可以到达d课程l2的阶段&#xf…

ORA-04098: trigger ‘SYS.GGS_DDL_TRIGGER_BEFORE‘ is invalid and failed re-validation处理

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;目前从事DBA及程序编程 &#xff08;Web\java\Python&#xff09;工作&#xff0c;主要服务于生产制造 现拥有 Oracle 11g OCP/OCM、 Mysql、Oceanbase&#xff08;OBCA&#xff09;认证 分布式TBase\TDSQL数据库、国…

GGS.INI详解

先看一下典型的配置文件 [XN]WellName=A井WellField=JHJingTongName=井筒1JingTongField=JTJBSJTableName=JBSJFieldAllTableName=FIELDALLXunBaoTableName=DZXBLJJBSJTableName=LJJBSJYXGWJMSTableName=YXGWJMSTGCXTableName=JSJGZTCXTableName=ZTCXWellDiagramTitle=油气解释…

HDU 4966:GGS-DDU

HDU&#xff1a;GGS-DDU 题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4966 题目大意&#xff1a;有$n$个课程&#xff0c;初始都在等级$0$&#xff0c;每个课程需要达到等级$a[i]$.满足$x$课程等级大于等于$dx$时&#xff0c;可花费$w$使得$y$课程等级达到…