Codechef Course Selection
Course Selection Problem Code: RIN
Submit
Read problems statements in Mandarin Chineseand Russian.
Rin is attending a university.
She has M semesters to finish her program, and that program has N required courses. Each course must be taken in exactly one of the semesters.
Some courses have prerequisites: for each i from 1 to K, she must take course A[i]before course B[i].
The same course may be taught by different professors in different semesters, and how well she does will depend on which professor teaches her. Additionally, some courses may not be taught every semester.
We are given an array X representing this information. For each course i and each semester j, X[i][j] = -1 if course i is not taught in semester j. Otherwise, X[i][j] will be an integer between 0 and 100: the expected score Rin will get if she takes course i in semester j.
Rin may take any number of courses per semester, including none, as long as they are taught that semester and she has already taken any required prerequisite courses.
Help Rin to find the maximal average score she can get over her whole program.
Input
The first line contain 3 integers: N, M and K.
This is followed by N lines, each containing M integers. The jth integer on the ith line represents the value of X[i][j].
This is followed by K lines, each containing two integers: A[i] and B[i].
Output
Output one real number: the maximal average score, rounded to 2 digits after the decimal point.
Constraints
- 1 ≤ M, N ≤ 100
- 0 ≤ K ≤ 100
- -1 ≤ X[i][j] ≤ 100
- 1 ≤ A[i], B[i] ≤ N
- For each i, A[i] ≠ B[i].
- For different i and j, (A[i], B[i]) ≠ (A[j], B[j]).
- We guarantee there exists a way to take these N courses in M semesters.
Subtasks
Subtask 1: (20 Points) A course can have at most 1 pre request course.
Subtask 2: (80 Points) Refer to constraints above
Example
Input 1:
3 2 2
70 100
100 80
100 90
1 2
1 3 Output 1:
80.00 Input 2:
4 5 4
20 -1 100 -1 -1
100 30 -1 -1 -1
100 -1 30 20 40
100 30 40 50 20
1 2
1 3
2 4
3 4 Output 2:
32.50
Explanation
Example case 1
The only way she can finish these 3 courses is: take course 1 in the first semester, then take courses 2 and 3 in the second semester. The average score is (70 + 80 + 90) / 3 = 80.00.
Example case 2
The optimal solution is: take course 1 in semester 1, course 2 in semester 2, course 3 in semester 3 and course 4 in semester 4.
n个课程要在m个学期里完成,
有k个依赖关系a,b ,表示a课程必须在b课程之前
每个课程在每个学期有相应得分
-1 表示本学期不开设此课程
问 最大的课程得分平均值
最大得分转化为最小扣分
对下面这张图跑最小割,ans=n*100-最小割

解释: Step 4 : inf边一定不会被割,a是b的前置课程,如果b的边割在了a之前,图可以通过inf边联通,不符合最小割
求助大佬,为什么以下建图方式不对

#include<queue>
#include<cstdio>
#include<algorithm>
#define inf 0x7fffffff
#define N 10101
#define M 50000
using namespace std;
queue<int>q;
int n,m,k,src,decc,tmp;
int front[N],to[M],nxt[M],tot=;
int lev[N],cur[N],cap[M];
int score[][];
bool f[];
//#define turn((i),(j)) ((i)-1)*(m+1)+(j)
int turn(int i,int j)
{
return (i-)*m+j;
}
void add(int u,int v,int w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; cap[tot]=w;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
}
bool bfs()
{
while(!q.empty()) q.pop();
for(int i=src;i<=decc;i++) cur[i]=front[i],lev[i]=-;
lev[src]=; q.push(src);
int now;
while(!q.empty())
{
now=q.front(); q.pop();
for(int i=front[now];i;i=nxt[i])
{
if(lev[to[i]]==-&&cap[i]>)
{
lev[to[i]]=lev[now]+;
if(to[i]==decc) return true;
q.push(to[i]);
}
}
}
return false;
}
int dinic(int now,int flow)
{
if(now==decc) return flow;
int rest=,delta;
for(int &i=cur[now];i;i=nxt[i])
{
if(lev[to[i]]>lev[now]&&cap[i]>)
{
delta=dinic(to[i],min(flow-rest,cap[i]));
if(delta)
{
cap[i]-=delta; cap[i^]+=delta;
rest+=delta; if(rest==flow) break;
}
}
}
if(rest!=flow) lev[now]=-;
return rest;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
int x; decc=n*m+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&score[i][j]);
for(int i=;i<=n;i++) add(turn(i,m),decc,inf);
int a,b;
while(k--)
{
scanf("%d%d",&a,&b);
for(int i=;i<m;i++) add(turn(a,i),turn(b,i+),inf);
f[b]=true;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(j==)
{
if(f[i]) add(src,turn(i,),inf);
else add(src,turn(i,),score[i][j]==- ? inf : -score[i][j]);
}
else add(turn(i,j-),turn(i,j),score[i][j]==- ? inf : -score[i][j]);
while(bfs())
tmp+=dinic(src,inf);
tmp=n*-tmp;
printf("%.2lf",double(tmp)/n);
}
错误建图代码
#include<queue>
#include<cstdio>
#include<algorithm>
#define inf 0x7fffffff
#define N 10101
#define M 50000
using namespace std;
queue<int>q;
int n,m,k,src,decc,tmp;
int front[N],to[M],nxt[M],tot=;
int lev[N],cur[N],cap[M];
//#define turn((i),(j)) ((i)-1)*(m+1)+(j)
int turn(int i,int j)
{
return (i-)*(m+)+j;
}
void add(int u,int v,int w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; cap[tot]=w;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
}
bool bfs()
{
while(!q.empty()) q.pop();
for(int i=src;i<=decc;i++) cur[i]=front[i],lev[i]=-;
lev[src]=; q.push(src);
int now;
while(!q.empty())
{
now=q.front(); q.pop();
for(int i=front[now];i;i=nxt[i])
{
if(lev[to[i]]==-&&cap[i]>)
{
lev[to[i]]=lev[now]+;
if(to[i]==decc) return true;
q.push(to[i]);
}
}
}
return false;
}
int dinic(int now,int flow)
{
if(now==decc) return flow;
int rest=,delta;
for(int &i=cur[now];i;i=nxt[i])
{
if(lev[to[i]]>lev[now]&&cap[i]>)
{
delta=dinic(to[i],min(flow-rest,cap[i]));
if(delta)
{
cap[i]-=delta; cap[i^]+=delta;
rest+=delta; if(rest==flow) break;
}
}
}
if(rest!=flow) lev[now]=-;
return rest;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
int x; decc=n*(m+)+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
scanf("%d",&x);
if(x==-) x=inf;
else x=-x;
add(turn(i,j),turn(i,j+),x);
}
for(int i=;i<=n;i++)
add(,turn(i,),inf),
add(turn(i,m+),decc,inf);
int a,b;
while(k--)
{
scanf("%d%d",&a,&b);
for(int i=;i<=m;i++) add(turn(a,i),turn(b,i+),inf);
}
while(bfs())
tmp+=dinic(src,inf);
tmp=n*-tmp;
printf("%.2lf",double(tmp)/n);
}
Codechef Course Selection的更多相关文章
- Course Selection CodeChef - RIN
All submissions for this problem are available. Read problems statements in Mandarin Chineseand Russ ...
- CodeChef - RIN Course Selection
Read problems statements in Mandarin Chineseand Russian. Rin is attending a university. She has M se ...
- Codechef RIN 「Codechef14DEC」Course Selection 最小割离散变量模型
问题描述 提供中文版本好评,一直以为 Rin 是题目名字... pdf submit 题解 参考了 东营市胜利第一中学姜志豪 的<网络流的一些建模方法>(2016年信息学奥林匹克中国国家队 ...
- oncopy="document.selection.empty()"跟oncopy="return false"什么区别?
实现效果一样,禁止复制. 区别: oncopy="document.selection.empty()" 没禁止,只是把它复制的内容,变成空了: oncopy="ret ...
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- D3中selection之使用
1. 极为重要的reference: [1] How selections works. http://bost.ocks.org/mike/selection/ [2] Nested selecti ...
- CSS的::selection使用方法
请选择本页面文本看看:http://hovertree.com/h/bjaf/38hq6y9d.htm CSS改变默认文本选中的颜色的方法 一般情况下在网页里的文本我们用鼠标选中的时候都是蓝色的,这个 ...
- 浏览器Range,Selection等选中文本对象
Range对象 Range 对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域. 最常见的Range是用户文本选择范围(user text selection).当用户选择了页面上的 ...
- 【转】[特征选择] An Introduction to Feature Selection 翻译
中文原文链接:http://www.cnblogs.com/AHappyCat/p/5318042.html 英文原文链接: An Introduction to Feature Selection ...
随机推荐
- 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息
项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...
- 解决Ubuntu(Linux)平台下Sublime Text 3 安装中文输入支持库后 开启gnome-terminal报错的问题
在Ubuntu下安装Sublim Text3后发现无法输入中文,按照此链接的方法解决后.然后用下列代码配置C++的编译系统: { "cmd":["g++",&q ...
- [2017BUAA软工]第一次博客作业
一.一些疑问 看书看得比较慢,暂时只思考了以下几个问题,有些自问自答,不知道符合不符合要求…… [1] 第一章中书上提到了这样一个例子: “如果一架民用飞机上有需求,用户使用它的概率是百万分之一,你还 ...
- 常用的一些sql
--根据某一列中包括的逗号将一行数据变多行 select a,c from (with test as (select 'abc' a,'1,2,3' c from dual e) select a, ...
- bootstrap 中的静态模式的控制按钮上的一个坑
在使用modal时发现,代码:<button class="btn btn-danger" data-toggle="modal" data-target ...
- iOS-开发者账号与证书
0.开发者账号的申请 1.iOS-证书相关 2.iOS-证书申请 3.iOS-APNS证书申请与使用 4.iOS-App发布证书的申请与使用
- 最小费用流spfa最小费用路算法模板(pascal)
3.30: 这篇是以前写的,用的还是指针存图,今天又写了个代码,码风稍微好看点. 传送门:http://www.cnblogs.com/Currier/p/6648685.html --------- ...
- 洛谷 P2530 [SHOI2001]化工厂装箱员 解题报告
P2530 [SHOI2001]化工厂装箱员 题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B ...
- Codeforces 906B. Seating of Students(构造+DFS)
行和列>4的可以直接构造,只要交叉着放就好了,比如1 3 5 2 4和2 4 1 3 5,每一行和下一行用不同的方法就能保证没有邻居. 其他的可以用爆搜,每次暴力和后面的一个编号交换并判断可行性 ...
- 洛谷10月月赛R2·浴谷八连测R3题解
早上打一半就回家了... T1傻逼题不说了...而且我的写法比题解要傻逼很多T T T2可以发现,我们强制最大值所在的块是以左上为边界的倒三角,然后旋转4次就可以遍历所有的情况.所以二分极差,把最大值 ...