任务安排

给定N(<=300)个人和N台机器,以及每个人操作某台机器的收益。请计算所有人都工作的情况下,最大的收益和。
输入:
第一行两个数分别表示人和机器的数量(两数相等)
接下来若干行,每行三个数,a,b,c表示a 操作机器b的收益为c.
输出:
两个数。(第一个数表示参加工作的人数(此数为N),第二个数表示最大收益和。)
样例:
输入:
3 3
1 2 10
1 1 9
1 3 3
2 1 10
2 2 9
2 3 3
3 1 8
3 2 9
3 3 8
输出:
3 28

最大费用流的话就是搞成负的再求最小费用流,也是很裸的题 。

  1 #include <iostream>
  2 #include <cstdlib>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <queue>
  6 const int inf = 1 << 30 , maxn = 600 + 11 ;//1061109567
  7 using namespace std ;
  8 int n , val[maxn][maxn] , vol[maxn][maxn] , dis[maxn] , mark[maxn] , ans , s , t ;
  9 queue< int > Q;
 10
 11 inline void Init(  )
 12 {
 13     freopen( "NSOOJ#10400.in" , "r" , stdin ) ;
 14     freopen( "NSOOJ#10400.out" , "w" , stdout ) ;
 15 }
 16
 17 void add( int u , int v , int va , int vo )
 18 {
 19     val[u][v] = va , vol[u][v] = vo ;
 20 }
 21
 22
 23 void input( )
 24 {
 25     scanf( "%d" , &n ) ; scanf( "%d" , &n ) ;
 26     int a , b ,c ; s = 0 , t = (n<<1) + 2 ;
 27     while( ~scanf( "%d%d%d" , &a , &b , &c ) )
 28     {
 29 //        cout<<a<<" "<<b<<" "<<c<<endl;
 30         add( a , b+n , inf , -c ) ;
 31         add( b+n , a , 0 , c ) ;
 32     }
 33     for( int x = 1 ; x <= n ; ++x )
 34     {
 35         add( s , x , 1 , 0 ) ;
 36         add( x , s , 0 , 0 ) ;
 37     }
 38     for( int x = 1 ; x <= n; ++x )
 39     {
 40         add( x+n , t-1 , 1 , 0 ) ;
 41         add( t-1 , x+n , 0 , 0 ) ;
 42     }
 43     add( t-1 , t , n , 0 ) ;
 44     add( t , t-1 , 0 , 0 ) ;
 45 }
 46
 47
 48 bool spfa(  )
 49 {
 50     memset( mark , 0 , sizeof(mark) ) ;
 51     memset( dis , 127/2 , sizeof(dis) ) ;
 52     mark[t] = 1 , dis[t] = 0 ; Q.push( t ) ;
 53     while( !Q.empty( ) )
 54     {
 55         int u = Q.front( ) ; Q.pop( ) ;
 56         for( int i = 0 ; i <= t ; i++ )
 57         {
 58             if( val[i][u]  && dis[i] > dis[u] + vol[i][u] )
 59             {
 60                 dis[i] = dis[u] + vol[i][u] ;
 61                 if( !mark[i] )
 62                 {
 63                     Q.push( i ) ;
 64                     mark[i] = true ;
 65                 }
 66             }
 67         }
 68         mark[u] = false ;
 69     }
 70     return dis[s] != 1061109567 ;
 71 }
 72
 73
 74 int dfs( int u , int f )
 75 {
 76     mark[u] = 1 ;
 77     if( u == t ) return f ;
 78     int w , used = 0 ;
 79     for( int v = 0 ; v <= t ; ++v )
 80     {
 81         if( dis[v] == dis[u] - vol[u][v] && val[u][v]  && !mark[v] )
 82         {
 83             w = f - used ;
 84             w = dfs( v , min( w , val[u][v] ) ) ;
 85             val[u][v] -= w , val[v][u] += w , used += w ;
 86             ans += w * vol[u][v] ;
 87             if( used == f ) return used ;
 88         }
 89     }
 90     return used ;
 91 }
 92
 93
 94 void zkw( )
 95 {
 96     int sum = 0 ;
 97     while( spfa( ) )
 98     {
 99         mark[t] = 1 ;
100         while( mark[t] )
101         {
102             memset( mark , 0 , sizeof(mark) ) ;
103             sum += dfs( s , inf ) ;
104         }
105
106     }
107     printf( "%d %d\n" , sum , 0-ans ) ;
108 }
109
110
111
112 int main( )
113 {
114 //    Init(  ) ;
115     input( ) ;
116     zkw( ) ;
117 //    fclose( stdin ) ;
118 //    fclose( stdout ) ;
119     return 0 ;
120 }
时间: 2024-12-23 20:59:52

任务安排的相关文章

九度oj 题目1499:项目安排

题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的.由于小明马上就要硕士毕业了,面临着买房.买车.给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包.万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠). 输

BZOJ1725: [Usaco2006 Nov]Corn Fields牧场的安排

1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 400  Solved: 290[Submit][Status] Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用.遗憾的是,有些土地相当的贫

NOJ 1163 活动安排问题 [动态规划]

活动安排问题 时间限制(普通/Java) : 3000 MS/ 9000 MS 运行内存限制 : 65536 KByte总提交 : 202            测试通过 : 55 比赛描述 设有n个活动的集合E={1,2,--,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi.如果选择了活动i,则它在时间区间[si,fi]内占用资源.若区间[si,fi]与区间[sj,fj

洛谷P1160 队列安排 链表

洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std

关于计应151/152《软件工程》课程实践的安排

通过前一阶段的准备,同学们已经掌握了软件开发流程的相关知识,尽管部分知识有待后续课程解决,但已经具备开始实践的必要知识,因此,从下周一开始,我们的课程实践项目正式开始.具体安排如下: 1.整个开发活动以小组展开,在每一周结束时,小组要提交经过小组实践行动形成的文档,文档内容由我在班级博客上发布,并通过小组长的博客发布,标题格式为:计应XX班第X小组XXX(文档内容标题).文档的具体书写格式和小组的活动方式请参考教材有关章节的内容,这些我会在每次小组作业安排时提示. 2.每个小组成员,根据自己在参

【贪心】电视节目安排

问题 W: [贪心]电视节目安排 时间限制: 1 Sec  内存限制: 64 MB提交: 22  解决: 16[提交][状态][讨论版] 题目描述 李旭琳发现小墨老师在班上是最顽劣的学生(没有之一),但他也有安静的时候,例如在看电视的时候.像什么“谍战剧”啊,“翻拍剧”啊,“婆媳戏”啊,“后宫剧”啊都是他的最爱.他甚至会事先查询所有喜欢看的电视节目的转播时间表并煞有介事的用红蓝铅笔列出计划,然后合理安排,以看到尽量多的完整节目. 输入 输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n

51nod 1428 活动安排问题(优先队列)

1428 活动安排问题 首先按照开始时间从小到大排序. 其实只要维护一个结束时间的最小堆,每次比较开始时间和堆中最小时间的大小,如果比它大就放入堆中并且时间就要变成当前任务的结束时间, 否则就要新开一个教室.并且把结束时间加入堆中,注意判断堆是否为空. #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; struct p

BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )

考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N)  F, T均为后缀和. 与j有关的量只有t = dp(j) - F(i) * T(j) , 我们要最小化它. dp(j)->y, T(j)->x, 那么y = F(i) * x + t, 就是给一些点和一个斜率...然后最小化截距, 显然维护下凸包就可以了. 然后因为无比坑爹的出题人....时间可以为负数, 所以要用平衡树维护(

FZU5BOYS-Beta版本冲刺计划及安排

1.下一阶段需要改进完善的功能 话题模块(分类参考Citeulike论文网站),文章/计划的删除功能 2.下一阶段新增的功能 1)推荐模块(冷启动问题,拟爬取部分豆瓣数据,部分伪专家数据(我们团队), 2)基于ItemCF的协同过滤), 3)聊天模块(bmob) , 4)评论功能(Star,comment) 3.需要改进的团队分工(针对之前的不足,需要加强和改进团队协作和分工的地方) 1)让对java不是很熟悉的队友先做xml布局,然后研究button的click事件,对于bundle,inte

房间安排

描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间,在中国上海市举行.本次世博会也是由中国举办的首届世界博览会.上海世博会以“城市,让生活更美好”(Better City,Better Life)为主题,将充分探索21世纪城市生活. 这次世博会总投资达450亿人民币,创造了世界博览会史上的最大规模记录.吸引200个国家和国际组织参展.预计有7000万人次的参观者. 为了更好地接待在这期间来自世界各地的参观者,如何合理安排各宾馆的住房问