HDU2883.kebab
2015-07-25 14:43
211 查看
[code]//因为时间的开始结束范围跨度较大,所以离散化 #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; }
相关文章推荐
- Xcode环境开发leveldb
- linux debain下vim高亮显示
- 利用淘宝云盘作为图床
- keil 配置超声波模块注意事项
- Integer to Roman
- Vector、ArrayList和Hashtable、HashMap数据结构(转)
- Linux 系统命令及其使用详解(大全)
- 字符在转换为ISO-8859-1字符集时可能会遭到破坏
- Android实现List<String>存储到SharedPreferences工具类
- 实习工作面试常问问题
- 项目中的连接本地服务器以及JSON解析
- sphinx 的问题整理
- 单例模式singleton
- Python中Django框架利用url来控制登录的方法
- mysql之replication配置
- linux crontab命令
- maven 发布 web 项目(分别使用 Jetty 和 Tomcat 作为容器)
- atan和atan2
- 自定义状态栏
- 【多路复用】I/O多路复用