Ombrophobic Bovines POJ
来源:互联网 发布:unity3d跳跃代码 编辑:程序博客网 时间:2024/05/21 20:57
Floyd+ 二分+最大流
vj挂了,不知道对不对
#include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cstdio>#include<vector>#include<queue>using namespace std;#define mem(a,b) memset(a,b,sizeof(a));#define sf scanf#define pf printf#define LL long long#define bug1 cout<<"bug1"<<endl;#define bug2 cout<<"bug2"<<endl;#define bug3 cout<<"bug3"<<endl;#define mem(a,b) memset(a,b,sizeof(a));#define inf 0x3f3f3f3fconst int maxn=2205;const int INF=1e9+5;struct Edge { int from, to, cap, flow;};bool operator < (const Edge& a, const Edge& b) { return a.from < b.from || (a.from == b.from && a.to < b.to);}struct Dinic { int n, m, s, t; vector<Edge> edges; vector<int> G[maxn]; bool vis[maxn]; int d[maxn]; int cur[maxn]; void init(int n) { for(int i = 0; i < n; i++) G[i].clear(); edges.clear(); } void ClearFlow() { for(int i = 0; i < edges.size(); i++) edges[i].flow = 0; } 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); } bool BFS() { memset(vis, 0, sizeof(vis)); queue<int> Q; Q.push(s); vis[s] = 1; d[s] = 0; 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]; } int DFS(int x, int a) { if(x == t || a == 0) return a; int 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; } int maxflow(int s, int t) { this->s = s; this->t = t; int flow = 0; while(BFS()) { memset(cur, 0, sizeof(cur)); flow += DFS(s, INF); } return flow; } vector<int> Mincut() { vector<int> ans; for(int i = 0; i < edges.size(); i++) { Edge& e = edges[i]; if(vis[e.from] && !vis[e.to] && e.cap > 0) ans.push_back(i); } return ans; } void Reduce() { for(int i = 0; i < edges.size(); i++) edges[i].cap -= edges[i].flow; }};Dinic g;int f,p;int d[maxn][maxn];struct OP{ int c,d;}op[maxn];int main(){ //OP op[maxn]; while(~sf("%d%d",&f,&p)){ int s=0,t=2*f+1; g.init(t+1); int sum=0; for(int i=1;i<=f;++i){ int a,b; sf("%d%d",&a,&b); op[i].c=a;op[i].d=b; //cout<<op[i].c<<' '<<op[i].d<<endl;//怎么回事。。居然输出不了。。 sum+=a; } mem(d,inf); for(int i=1;i<=p;++i){ int a,b,c; sf("%d%d%d",&a,&b,&c); if(d[a][b]>c){ d[a][b]=d[b][a]=c; } } for(int k=1;k<=f;++k){ for(int i=1;i<=f;++i){ for(int j=1;j<=f;++j){ if(i==j)d[i][j]=0; d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } } } int l=0,r=INF; while(l<r){ int mid=(l+r)>>1; g.init(t+1); for(int i=1;i<=f;++i){ g.addedge(s,i,op[i].c); g.addedge(i,i+f,op[i].d); g.addedge(i+f,t,op[i].d); } for(int i=1;i<=f;++i){ for(int j=1;j<=f;++j){ if(d[i][j]<=mid){ g.addedge(i,j+f,INF); } } } int tmp=g.maxflow(s,t); if(tmp==sum)r=mid; else l=mid+1; } pf("%d\n",r); }}#include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cstdio>#include<vector>#include<queue>using namespace std;#define mem(a,b) memset(a,b,sizeof(a));#define sf scanf#define pf printf#define LL long long#define bug1 cout<<"bug1"<<endl;#define bug2 cout<<"bug2"<<endl;#define bug3 cout<<"bug3"<<endl;#define mem(a,b) memset(a,b,sizeof(a));#define inf 0x3f3f3f3fconst int maxn=2205;const int INF=1e9+5;struct Edge { int from, to, cap, flow;};bool operator < (const Edge& a, const Edge& b) { return a.from < b.from || (a.from == b.from && a.to < b.to);}struct Dinic { int n, m, s, t; vector<Edge> edges; vector<int> G[maxn]; bool vis[maxn]; int d[maxn]; int cur[maxn]; void init(int n) { for(int i = 0; i < n; i++) G[i].clear(); edges.clear(); } void ClearFlow() { for(int i = 0; i < edges.size(); i++) edges[i].flow = 0; } 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); } bool BFS() { memset(vis, 0, sizeof(vis)); queue<int> Q; Q.push(s); vis[s] = 1; d[s] = 0; 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]; } int DFS(int x, int a) { if(x == t || a == 0) return a; int 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; } int maxflow(int s, int t) { this->s = s; this->t = t; int flow = 0; while(BFS()) { memset(cur, 0, sizeof(cur)); flow += DFS(s, INF); } return flow; } vector<int> Mincut() { vector<int> ans; for(int i = 0; i < edges.size(); i++) { Edge& e = edges[i]; if(vis[e.from] && !vis[e.to] && e.cap > 0) ans.push_back(i); } return ans; } void Reduce() { for(int i = 0; i < edges.size(); i++) edges[i].cap -= edges[i].flow; }};Dinic g;int f,p;int d[maxn][maxn];struct OP{ int c,d;}op[maxn];int main(){ //OP op[maxn]; while(~sf("%d%d",&f,&p)){ int s=0,t=2*f+1; g.init(t+1); int sum=0; for(int i=1;i<=f;++i){ int a,b; sf("%d%d",&a,&b); op[i].c=a;op[i].d=b; //cout<<op[i].c<<' '<<op[i].d<<endl;//怎么回事。。居然输出不了。。 sum+=a; } mem(d,inf); for(int i=1;i<=p;++i){ int a,b,c; sf("%d%d%d",&a,&b,&c); if(d[a][b]>c){ d[a][b]=d[b][a]=c; } } for(int k=1;k<=f;++k){ for(int i=1;i<=f;++i){ for(int j=1;j<=f;++j){ if(i==j)d[i][j]=0; d[i][j]=min(d[i][j],d[i][k]+d[k][j]); } } } int l=0,r=INF; while(l<r){ int mid=(l+r)>>1; g.init(t+1); for(int i=1;i<=f;++i){ g.addedge(s,i,op[i].c); g.addedge(i,i+f,op[i].d); g.addedge(i+f,t,op[i].d); } for(int i=1;i<=f;++i){ for(int j=1;j<=f;++j){ if(d[i][j]<=mid){ g.addedge(i,j+f,INF); } } } int tmp=g.maxflow(s,t); if(tmp==sum)r=mid; else l=mid+1; } pf("%d\n",r); }}
0 0
- Ombrophobic Bovines POJ 2391
- POJ 2391 Ombrophobic Bovines
- POJ-2391-Ombrophobic Bovines
- POJ 2391 Ombrophobic Bovines
- POJ 2391 -- Ombrophobic Bovines
- POJ 2391 Ombrophobic Bovines
- Ombrophobic Bovines POJ
- Ombrophobic Bovines POJ
- poj 2391 Ombrophobic Bovines
- POJ 2391 Ombrophobic Bovines
- POJ 2391 Ombrophobic Bovines Solution
- Ombrophobic Bovines
- POJ 2391 Ombrophobic Bovines //FLOTED+二分+SAP
- POJ 2391 Ombrophobic Bovines(最大流)
- poj 2391 Ombrophobic Bovines 网络流
- poj 2391 Ombrophobic Bovines (网络流)
- poj 2391 Ombrophobic Bovines 二分+最大流
- POJ 2391 Ombrophobic Bovines (网络流)
- 查看MYSQL数据库的占用空间
- ReentrantLock(二):正确使用Condition实现等待与通知
- 第十二章:DOM2 和 DOM3(DOM变化)
- VALSE 2017 | 人脸检测与识别技术年度进展概述
- 沁园春.长沙
- Ombrophobic Bovines POJ
- 【HTML5学习笔记】6:文档元素的使用
- jquery EasyUI的formatter格式化函数代码
- 第二章 如何学Linux
- C\C++调试技巧
- 通俗理解ZooKeeper是如何保证数据一致性的
- findbugs 的安装与使用
- imx6------watchdog导致不进系统
- 最全前端资源汇集