vector 的注意事项 (poj2195 小人进房子 最小费用最大流)
来源:互联网 发布:网络安全法展板 编辑:程序博客网 时间:2024/05/18 15:08
下图分别是用50w和20wsize的vector跑出来的结果,vector.clear()耗时太长!尽量开小
附poj2195ac代码
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <cstring> #include <queue> #include <string> #include <map> using namespace std; #define Del(a,b) memset(a,b,sizeof(a)) const int inf = 0x3f3f3f3f; const int N=50000; struct Point{ int x, y; Point():x(0), y(0){}; Point(int x0, int y0): x(x0),y(y0){}; }fih[50000], fim[50000]; struct Node { int from,to,cap,flow,cost; }; vector<Node> e; vector<int> v[N]; int vis[N],dis[N]; int p[N],a[N]; //p保存father,a保存cap void Clear(int x) { for(int i=0;i<=x;i++) v[i].clear(); e.clear(); } void add_Node(int from,int to,int cap,int cost) { e.push_back((Node){from,to,cap,0,cost}); e.push_back((Node){to,from,0,0,-cost}); int len = e.size()-1; v[to].push_back(len); v[from].push_back(len-1); } bool BellmanFord(int s,int t,int& flow,int& cost) { Del(dis,inf); Del(vis,0); dis[s] = 0; vis[s] = 1; p[s] = 0; a[s] = inf; queue<int> q; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for(int i=0; i<v[u].size(); i++) { Node& g = e[v[u][i]]; if(g.cap>g.flow && dis[g.to] > dis[u]+g.cost) { dis[g.to] = dis[u] + g.cost; p[g.to] = v[u][i]; //保存前驱 a[g.to] = min(a[u],g.cap-g.flow); if(!vis[g.to]) { q.push(g.to); vis[g.to]=1; } } } } if(dis[t] == inf) return false; flow += a[t]; cost += dis[t]*a[t];///可能需要修改,本题下同一条路径上的每个单位流量都要消耗 int u = t; while(u!=s) { e[p[u]].flow += a[t]; e[p[u]^1].flow -= a[t]; u = e[p[u]].from; } //cout<<"BF Done"<<endl; return true; } int Min_Cost(int s,int t) { int flow=0,cost = 0; while(BellmanFord(s,t,flow,cost)); //cout<<"MC Done"<<endl; return cost; } int main() { int n,m,k; //n 店主 k 物品 M 供应商 while((~scanf("%d%d",&n,&m)) && (m+n)) //多组测试数据,mnk均=0时输入结束 { int s = 0, totm=0, toth=0; for (int i=0; i<n; i++){ string rubbish;getline(cin, rubbish); for (int j=0; j<m; j++) { char c; scanf("%c", &c); //cout<<"c="<<c<<endl; if (c=='H') fih[++toth]=Point(i,j); else if(c=='m') fim[++totm]=Point(i,j); } } //s=0, 1..totm, totm+1..totm+toth, t=toth+totm+1; for (int i=1; i<=totm; i++) add_Node(0, i, 1, 0); for (int i=1; i<=totm; i++) for (int j=1; j<=toth; j++) add_Node(i,j+totm,1, abs(fih[i].x-fim[j].x)+abs(fih[i].y-fim[j].y)); for (int i=totm+1; i<=totm+toth; i++) add_Node(i, totm+toth+1, 1, 0); cout<<Min_Cost(0, totm+toth+1)<<endl; Clear(totm+toth+1); } return 0; }
阅读全文
0 0
- vector 的注意事项 (poj2195 小人进房子 最小费用最大流)
- 最小费用最大流--poj2195
- POJ2195(最小费用最大流)
- poj2195(二分图最大匹配,最小费用流)
- poj2195 Going Home(最大费用最小流)
- POJ2195-Going Home(最小费用最大流)
- poj2195——Going Home(最小费用最大流)
- POJ2195 Going Home 最小费用最大流
- poj2195 Going Home,最小费用最大流
- poj2195--Going Home(最小费用最大流)
- poj2195 Going Home 最小费用最大流
- poj2195 spfa 最小费用最大流
- poj 2195 最小费用最大流(小人回家)
- poj2195 -最小费用流
- POJ2195-Going Home(最小费用流)
- POJ2195 Going Home(SPFA最小费用最大流)
- POJ2195 Going Home(最小费用最大流mcmf)
- 【POJ2195】Going Home-最小费用最大流模板题
- 程序调用过程
- Computer Network Basic
- Linux进程简述
- 移植Qt与Tslib到X210开发板的体会
- 移植tslib和Qt5.6到三星s5pv210开发板
- vector 的注意事项 (poj2195 小人进房子 最小费用最大流)
- hdu 1142 A Walk Through the Forest
- 判断两个对象相等 和重写equals、 hashcode
- 比较两对象为什么要重写hashCode()方法
- android 中通知消息中打开activity带参数的问题
- linux环境下为php7装phpredis扩展
- AI challenger 场景分类 tensorflow inception-resnet-v2 LB: 0.94361
- Redis在Centos7上的安装部署
- Centos7下安装php-redis扩展及简单使用