HDU2883.kebab
来源:互联网 发布:淘宝登录页面网页制作 编辑:程序博客网 时间:2024/05/22 10:33
//因为时间的开始结束范围跨度较大,所以离散化#include <map>#include <set>#include <stack>#include <queue>#include <cmath>#include <ctime>#include <vector>#include <cstdio>#include <cctype>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define inf -0x3f3f3f3f#define lson k<<1, L, mid#define rson k<<1|1, mid+1, R#define mem0(a) memset(a,0,sizeof(a))#define mem1(a) memset(a,-1,sizeof(a))#define mem(a, b) memset(a, b, sizeof(a))typedef long long ll;const int maxn=1000 + 10;struct Edge{ int from,to,cap,flow; Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}};struct Dinic{ int n,m,s,t; //结点数,边数(包括反相弧),源点编号和汇点编号 vector<Edge>edges; //边表,edges[e]和edges[e^1]互为反相弧 vector<int>G[maxn]; //邻接表,G[i][j]表示结点i的第j条边在e数组中的序号 bool vis[maxn]; //BFS使用 int d[maxn]; //从起点到i的距离 int cur[maxn]; //当前弧下标 void AddEdge(int from,int to,int cap){ edges.push_back(Edge(from,to,cap,0)); edges.push_back(Edge(to,from,0,0)); m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } void init(int n){ this->n=n; for(int i=0;i<=n;i++) G[i].clear(); edges.clear(); } bool BFS(){ mem0(vis); queue<int>Q; Q.push(s); d[s]=0; vis[s]=1; while(!Q.empty()){ int x=Q.front(); Q.pop(); for(int i=0;i<G[x].size();i++){ //只考虑残量网络中的弧 Edge& e=edges[G[x][i]]; if(!vis[e.to]&&e.cap>e.flow){ vis[e.to]=1; d[e.to]=d[x]+1; Q.push(e.to); } } } return vis[t]; } ll DFS(int x,int a){ if(x==t||a==0) return a; ll flow=0,f; for(int& i=cur[x];i<G[x].size();i++){ Edge& e=edges[G[x][i]]; if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0){ e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0) break; } } return flow; } ll Maxflow(int s,int t){ this->s=s; this->t=t; ll flow=0; while(BFS()){ mem0(cur); flow+=DFS(s,INF); } return flow; }};Dinic solve;struct node{ int si,ei;}a[maxn];int time1[3001];int main(){ int x,y,z; int n,m; while(scanf("%d%d",&n,&m)==2){ solve.init(3*n+2); //初始化 int num; int ti; int cnt=0; ll full_flow=0; //printf("PPPPPP\n"); for(int i=1;i<=n;i++){ scanf("%d%d%d%d",&a[i].si,&num,&a[i].ei,&ti); solve.AddEdge(0,i,num*ti); time1[cnt++]=a[i].si; time1[cnt++]=a[i].ei; full_flow+=num*ti; } sort(time1,time1+cnt); for(int i=1;i<=n;i++) for(int j=0;j<cnt;j++){ if(a[i].si<=time1[j]&&a[i].ei>=time1[j+1]) solve.AddEdge(i,n+j+1,INF); } //printf("PPPPPP\n"); int t=3*n+2; for(int i=0;i<cnt;i++) solve.AddEdge(i+n+1,t,(time1[i+1]-time1[i])*m); ll tmp=solve.Maxflow(0,t); if(tmp==full_flow) printf("Yes\n"); else printf("No\n"); } return 0;}
0 0
- HDU2883.kebab
- hdu2883 kebab
- 【最大流】【HDU2883】【kebab】
- HDU2883 kebab(最大流)
- hdu2883 kebab(判满流)
- hdu2883
- hdu2883
- HDU2883 kebab(中等) [最大流]判断满流(数据离散化)
- hdu2883(DINIC最大流)
- hdu 2883 kebab
- hdu 2833 kebab
- hdu 2883 kebab
- HDU 2883 kebab
- hdu 2883 kebab
- hdu 2883 kebab
- hdu2883 网络流 离散化 建图
- HDU 2883 kebab 网络流
- HDU 2883 kebab 最大流判满流
- keil 配置超声波模块注意事项
- php 简单方式截取中文字符串
- Linux设备驱动中的中断处理
- Linux的常用命令(2) - 关机
- 数据结构浅析(二)
- HDU2883.kebab
- RNN以及LSTM的介绍和公式梳理
- iOS OC07.2_类的扩展
- 最简单的基于FFmpeg的移动端例子:Android 视频转码器
- C - The C Answer (2nd Edition) - Exercise 1-15
- Linux目录结构
- 分布式网络爬虫Nutch中文教程nutcher(JAVA)
- 【Android归纳】Activity启动模式
- uva536_树的重建(由先序,中序历遍推出后续历遍)