Task Schedule HDU
来源:互联网 发布:php数组添加键值对 编辑:程序博客网 时间:2024/06/06 07:36
点击打开链接
hdu这个题卡时间 之前的EK和dinic板子根本过不了 才换成了isap
但是对isap还有一些不理解的地方 留个坑吧..
poj上还有一道基本一样的
hdu 3572
#include <bits/stdc++.h>using namespace std;#define N 1e9struct node{ int v; int w; int next;};node edge[200010];int first[200010],dis[200010],gap[200010],cur[200010],pre[200010];int t,n,m,ss,num,ee,ans;void addedge(int u,int v,int w){ edge[num].v=v; edge[num].w=w; edge[num].next=first[u]; first[u]=num++; return;}void isap();void bfs();int main(){ int t,cas,sum,i,j,p,s,e; scanf("%d",&t); cas=1; while(t--) { scanf("%d%d",&n,&m); memset(first,-1,sizeof(first)); num=0,ss=n+500+1,ee=n+500+2,sum=0; for(i=1;i<=n;i++) { scanf("%d%d%d",&p,&s,&e); sum+=p; addedge(ss,i,p); addedge(i,ss,0); for(j=n+s;j<=n+e;j++) { addedge(i,j,1); addedge(j,i,0); } } for(i=n+1;i<=n+500;i++) { addedge(i,ee,m); addedge(ee,i,0); } num=n+500+2; isap(); if(ans==sum) printf("Case %d: Yes\n\n",cas++); else printf("Case %d: No\n\n",cas++); } return 0;}void isap(){ int j,u,v,flow,minn; bfs(); memcpy(cur,first,sizeof(first)); memset(pre,-1,sizeof(pre)); ans=0,u=ss,flow=N; while(dis[ss]<num) { int &i=cur[u]; for(;i!=-1;i=edge[i].next) { v=edge[i].v; if(dis[v]+1==dis[u]&&edge[i].w>0) { pre[v]=i; u=v,flow=min(flow,edge[i].w); if(u==ee) { while(u!=ss) { j=pre[u]; edge[j].w-=flow; edge[j^1].w+=flow; u=edge[j^1].v; } ans+=flow,flow=N; } break; } } if(i==-1) { if(--gap[dis[u]]==0) break; cur[u]=first[u]; minn=num-1; for(j=first[u];j!=-1;j=edge[j].next) { if(edge[j].w>0) { minn=min(minn,dis[edge[j].v]); } } dis[u]=minn+1; gap[dis[u]]++; if(u!=ss) { u=edge[pre[u]^1].v; } } } return;}void bfs(){ queue <int> que; int i,u,v; memset(dis,-1,sizeof(dis)); memset(gap,0,sizeof(gap)); que.push(ee); dis[ee]=0; while(!que.empty()) { u=que.front(); que.pop(); gap[dis[u]]++; for(i=first[u];i!=-1;i=edge[i].next) { v=edge[i].v; if(dis[v]==-1) { dis[v]=dis[u]+1; que.push(v); } } } return;}
poj 1698
#include <stdio.h>#include <queue>#include <cstring>#include <algorithm>using namespace std;#define N 1e9struct node{ int v; int w; int next;};node edge[100010];int first[1010],dis[1010],gap[1010],cur[1010],pre[1010];int n,num,ss,ee,ans;void addedge(int u,int v,int w){ edge[num].v=v; edge[num].w=w; edge[num].next=first[u]; first[u]=num++; return;}void isap();void bfs();int main(){ int film[10]; int t,i,j,k,d,w,sum; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(first,-1,sizeof(first)); num=0,ss=n+350+1,ee=n+350+2,sum=0; for(i=1;i<=n;i++) { for(j=1;j<=7;j++) { scanf("%d",&film[j]); } scanf("%d%d",&d,&w); sum+=d; addedge(ss,i,d); addedge(i,ss,0); for(j=0;j<w;j++) { for(k=n+j*7+1;k<=n+j*7+7;k++) { if(film[k-n-j*7]==1) { addedge(i,k,1); addedge(k,i,0); } } } } for(i=n+1;i<=n+350;i++) { addedge(i,ee,1); addedge(ee,i,0); } num=n+350+2; isap(); if(ans>=sum) printf("Yes\n"); else printf("No\n"); } return 0;}void isap(){ int j,u,v,flow,minn; bfs(); memcpy(cur,first,sizeof(first)); memset(pre,-1,sizeof(pre)); ans=0,u=ss,flow=N; while(dis[ss]<num) { int &i=cur[u]; for(;i!=-1;i=edge[i].next) { v=edge[i].v; if(dis[v]+1==dis[u]&&edge[i].w>0) { pre[v]=i; u=v,flow=min(flow,edge[i].w); if(u==ee) { while(u!=ss) { j=pre[u]; edge[j].w-=flow; edge[j^1].w+=flow; u=edge[j^1].v; } ans+=flow,flow=N; } break; } } if(i==-1) { if(--gap[dis[u]]==0) break; cur[u]=first[u]; minn=num-1; for(j=first[u];j!=-1;j=edge[j].next) { if(edge[j].w>0) { minn=min(minn,dis[edge[j].v]); } } dis[u]=minn+1; gap[dis[u]]++; if(u!=ss) { u=edge[pre[u]^1].v; } } } return;}void bfs(){ queue <int> que; int i,u,v; memset(dis,-1,sizeof(dis)); memset(gap,0,sizeof(gap)); que.push(ee); dis[ee]=0; while(!que.empty()) { u=que.front(); que.pop(); gap[dis[u]]++; for(i=first[u];i!=-1;i=edge[i].next) { v=edge[i].v; if(dis[v]==-1) { dis[v]=dis[u]+1; que.push(v); } } } return;}
阅读全文
0 0
- hdu 3572 Task Schedule
- HDU 3572 Task Schedule
- hdu 3572 Task Schedule
- HDU 4907 Task schedule
- hdu 4907 Task schedule
- hdu 4907 Task schedule
- HDU 4907 Task schedule
- hdu 4007 Task schedule
- hdu 4907 Task schedule
- HDU 4907 Task schedule
- HDU-4907 Task schedule
- HDU 3572 Task Schedule
- hdu 3572 Task Schedule
- hdu 3572 Task Schedule
- HDU 4907 Task schedule
- HDU 3572 Task Schedule
- HDU 3572 Task Schedule
- 【HDU】 3572 Task Schedule
- java关于Date类型的转换
- Word Break Ⅱ
- java学习记录——求出1-50的所有素数以及累加和
- C++运算符重载详解
- HTTP状态码大全
- Task Schedule HDU
- Maven+SpringBoot环境搭建
- 创建生成word文档时候,iis出现无权限的问题{000209FF-0000-0000-C000-000000000046}
- Trie树
- 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(六)基于CrossApp跨平台框架的MQTT客户端控制应用PC版
- ORA-28000: the account is locked-的解决办法 解锁 SQL> conn /as sysdba 已连接。 SQL> alter user jd account unloc
- 基于OpenCV打开摄像头的控制台程序
- Shell终端输出字符的颜色总结
- 树链剖分bzoj3626