设为首页 加入收藏

TOP

poj 1698 Alice's Chance (最大流Dinic)
2014-11-23 20:16:20 来源: 作者: 【 】 浏览:6
Tags:poj 1698 Alice' Chance 最大 Dinic

题目链接: poj 1689

题目大意: 有个人想拍n部电影,每部电影限定每周哪几天可以拍

并且必须在第ki周之前把这部电影拍完,问能否拍完n部电影

解题思路: 把每部电影当作一个顶点,源点指向这些顶点,容量为该电影需要拍多少天

然后把每一天都当作顶点,某个工作可以在这天完成就连容量为1大边

每天的顶点指向汇点,容量也为1

最后求出最大流,满流则说明可以完成这些工作

PS:用邻接表时要注意反向边也要加入,因为需要不断大增广直到最优解

代码:

#include 
  
   
#include 
   
     #include 
    
      #define MAX 402 #define INF 0x3f3f3f3f int n,m,S,E,Index,visit[MAX],flag[MAX][MAX],Map[MAX][MAX],listb[MAX]; struct snode{ int to,c,next; }Edge[MAX*MAX]; struct node{ int c; }edge[MAX][MAX]; int a[60][10],pre[MAX]; int Min(int a,int b) { return (a
     
      Max) Max=a[i][9]; edge[S][i].c=a[i][8]; //前面 Map[S][i]=a[i][8]; //前面 } E=n+(Max*7)+1; for(i=1;i<=n;i++) { for(j=1;j<=a[i][9];j++) { for(int j1=1;j1<=7;j1++) { if(a[i][j1]==1) { edge[i][n+(j-1)*7+j1].c=1; //中间 Map[i][n+(j-1)*7+j1]=1; //中间 edge[n+(j-1)*7+j1][E].c=1; //后面 Map[n+(j-1)*7+j1][E]=1; //后面 } } } } for(i=S;i<=E;i++) { for(j=S;j<=E;j++) { if(edge[i][j].c) { Add_edge(i,j,edge[i][j].c); Add_edge(j,i,-edge[i][j].c); //不存在,但是需要用到 } } } Solve(); int pd=1; for(i=1;i<=n;i++) { if(Map[S][i]!=0) { pd=0; break; } } if(pd) printf("Yes\n"); else printf("No\n"); } return 0; }
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇单独使用CRecordSet 下一篇与size_t有关的C语言编程失误――..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: