POJ 1698 图论之网络流
2016-03-20 13:50
447 查看
点击打开链接
题意:T组数据,每组第一个为n,表示有n演出,接下来的九个数前七个表示周一到周日,如果为1,可以在这天演出,后两个数代表演出多少天才算完成任务和在多少周之前必须演出结束,问这个人可以完成这些要求吗
思路:用最大流解决,建立一个源点和一个汇点,将源点与每一个节目相连,流量为这个节目需要的天数,然后将这个节目与每星期可以演出的日子连一条流量为1的边,最后将所有可以演出的日子与汇点连一条流量为1的边,最后只需判断最大流量是否等于需要的天数之和
题意:T组数据,每组第一个为n,表示有n演出,接下来的九个数前七个表示周一到周日,如果为1,可以在这天演出,后两个数代表演出多少天才算完成任务和在多少周之前必须演出结束,问这个人可以完成这些要求吗
思路:用最大流解决,建立一个源点和一个汇点,将源点与每一个节目相连,流量为这个节目需要的天数,然后将这个节目与每星期可以演出的日子连一条流量为1的边,最后将所有可以演出的日子与汇点连一条流量为1的边,最后只需判断最大流量是否等于需要的天数之和
#include <queue> #include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=510; int vis[maxn]; struct edge{ int to,cap,rev; edge(); edge(int a,int b,int c){to=a;cap=b;rev=c;}; }; vector<edge>G[maxn]; int dis[maxn],iter[maxn],v[maxn]; void addedge(int st,int en,int val){ G[st].push_back(edge(en,val,G[en].size())); G[en].push_back(edge(st,0,G[st].size()-1)); } void bfs(int st){ memset(dis,-1,sizeof(dis)); queue<int>que;dis[st]=0; que.push(st); while(!que.empty()){ int v=que.front();que.pop(); for(unsigned int i=0;i<G[v].size();i++){ edge &e=G[v][i]; if(e.cap>0&&dis[e.to]<0){ dis[e.to]=dis[v]+1; que.push(e.to); } } } } int dfs(int st,int en,int f){ if(st==en) return f; for(int &i=iter[st];i<G[st].size();i++){ edge &e=G[st][i]; if(e.cap>0&&dis[st]<dis[e.to]){ int d=dfs(e.to,en,min(f,e.cap)); if(d>0){ e.cap-=d; G[e.to][e.rev].cap+=d; return d; } } } return 0; } int max_flow(int s,int t){ int flow=0; while(1){ bfs(s); if(dis[t]<0) return flow; memset(iter,0,sizeof(iter)); int f; while((f=dfs(s,t,inf))>0) flow+=f; } } int main(){ int T,n,a,b,c,d,e,f,g,D,W; scanf("%d",&T); while(T--){ scanf("%d",&n); memset(vis,0,sizeof(vis)); int sum=0; for(int i=0;i<maxn;i++) G[i].clear(); for(int i=1;i<=n;i++){ scanf("%d%d%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g,&D,&W); if(a==1) for(int j=1;j<=W;j++) addedge(i,n+(j-1)*7+1,1),vis[n+(j-1)*7+1]=1; if(b==1) for(int j=1;j<=W;j++) addedge(i,n+(j-1)*7+2,1),vis[n+(j-1)*7+2]=1; if(c==1) for(int j=1;j<=W;j++) addedge(i,n+(j-1)*7+3,1),vis[n+(j-1)*7+3]=1; if(d==1) for(int j=1;j<=W;j++) addedge(i,n+(j-1)*7+4,1),vis[n+(j-1)*7+4]=1; if(e==1) for(int j=1;j<=W;j++) addedge(i,n+(j-1)*7+5,1),vis[n+(j-1)*7+5]=1; if(f==1) for(int j=1;j<=W;j++) addedge(i,n+(j-1)*7+6,1),vis[n+(j-1)*7+6]=1; if(g==1) for(int j=1;j<=W;j++) addedge(i,n+(j-1)*7+7,1),vis[n+(j-1)*7+7]=1; addedge(0,i,D);sum+=D; } for(int i=0;i<maxn;i++) if(vis[i]) addedge(i,411,1); int ans=max_flow(0,411); if(ans==sum) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- J2EE架构之路,好地址:http://www.fengfly.com/plus/view-210104-1.html
- http协议-缓存控制:no-cache/must-revalidate/no-store
- 《MFC网络通信》Part 2 简单TCP通信
- 神经网络可以拟合任意函数的视觉证明A visual proof that neural nets can compute any function
- 4000 基于DES加密的TCP聊天程序
- 计算机网络中一些名词解释(一)
- HttpClient 和 HttpURLConnection 的使用
- H5学习系列之文件读取API--本文转自http://blog.csdn.net/jackfrued/article/details/8967667
- linux 网络源码布局
- C++ 用libcurl库进行http通讯网络编程
- 基础的http协议构成
- TCP三次握手和四次挥手
- HTTP状态码整理
- 一些我推荐的和想上的网络课程(Coursera, edX, Udacity,MIT OCW)
- CentOS图形配置网络
- 虚拟化网络之OpenvSwitch(一)
- Tcp实现简单的大小写转换功能
- AsyncHttpClicent框架
- Tcp通讯协议
- HttpClient使用详解