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
原创粉丝点击