最短路+最大流

#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;const int maxn=1000+10;
const int MAXN=100000+10;
const int INF=0x7FFFFFFF;struct Edge
{int from,to,cap,flow;
};
vector<Edge>edges;
vector<int>G[maxn];
struct EE1
{int from,to,w;
} ee1[MAXN];
struct EE2
{int from,to,w;
} ee2[MAXN];
vector<EE1>SPFAG1[maxn];
vector<EE2>SPFAG2[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn];
int U[MAXN],V[MAXN],C[MAXN];
int FF1[maxn],Dis1[maxn],FF2[maxn],Dis2[maxn];
int n,m,s,t,N,M;//求出层次网络
bool BFS()
{memset(vis,0,sizeof(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];
}//加边
void AddEdge(int from,int to,int cap)
{Edge r;r.from=from;r.to=to;r.cap=cap;r.flow=0;edges.push_back(r);Edge d;d.from=to;d.to=from;d.cap=0;d.flow=0;edges.push_back(d);m=edges.size();G[from].push_back(m-2);G[to].push_back(m-1);
}//每个阶段来一次DFS增广
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 ss,int tt)
{int flow=0;while(BFS()){memset(cur,0,sizeof(cur));flow+=DFS(ss,INF);}return flow;
}void SPFA1()
{for(int i=0; i<=N; i++) Dis1[i]=INF;queue<int>Q;Q.push(s);FF1[s]=1;Dis1[s]=0;while(!Q.empty()){int h=Q.front();Q.pop();FF1[h]=0;for(int i=0; i<SPFAG1[h].size(); i++){EE1 edge=SPFAG1[h][i];if(Dis1[h]+edge.w<Dis1[edge.to]){Dis1[edge.to]=Dis1[h]+edge.w;if(FF1[edge.to]==0){FF1[edge.to]=1;Q.push(edge.to);}}}}
}void SPFA2()
{for(int i=0; i<=N; i++) Dis2[i]=INF;queue<int>Q;Q.push(t);FF2[t]=1;Dis2[t]=0;while(!Q.empty()){int h=Q.front();Q.pop();FF2[h]=0;for(int i=0; i<SPFAG2[h].size(); i++){EE2 edge=SPFAG2[h][i];if(Dis2[h]+edge.w<Dis2[edge.to]){Dis2[edge.to]=Dis2[h]+edge.w;if(FF2[edge.to]==0){FF2[edge.to]=1;Q.push(edge.to);}}}}
}int main()
{int TT;scanf("%d",&TT);while(TT--){scanf("%d%d",&N,&M);edges.clear();for(int i=0; i<maxn; i++) G[i].clear();for(int i=0; i<maxn; i++) SPFAG1[i].clear();for(int i=0; i<maxn; i++) SPFAG2[i].clear();for(int i=1; i<=M; i++){scanf("%d%d%d",&U[i],&V[i],&C[i]);ee1[i].from=U[i];ee1[i].to=V[i];ee1[i].w=C[i];ee2[i].from=V[i];ee2[i].to=U[i];ee2[i].w=C[i];SPFAG1[U[i]].push_back(ee1[i]);SPFAG2[V[i]].push_back(ee2[i]);}scanf("%d%d",&s,&t);SPFA1();SPFA2();for(int i=1; i<=M; i++)if(Dis1[U[i]]+Dis2[V[i]]+C[i]==Dis1[t])AddEdge(U[i],V[i],1);printf("%d\n",Maxflow(s,t));}return 0;
}

转载于:https://www.cnblogs.com/zufezzt/p/4752647.html

HDU 3416 Marriage Match IV相关推荐

  1. HDU - 3416 Marriage Match IV(最大流+最短路)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无环有向图,有自环,有重边,现在给出起点st和终点ed,问从st到ed共有多少条最短路,每条路最多只能经过一次 题目分析:看完题意后感觉是要 ...

  2. SPFA+Dinic HDOJ 3416 Marriage Match IV

    题目传送门 题意:求A到B不同最短路的条数(即边不能重复走, 点可以多次走) 分析:先从A跑最短路,再从B跑最短路,如果d(A -> u) + w (u, v) + d (B -> v) ...

  3. HDU 3081 Marriage Match II【并查集+二分图最大匹配】

    大意:有n个男孩n个女孩,告诉你每个女孩喜欢哪些男孩,又告诉你女孩之间的存在一些朋友关系 一个女孩可以和她喜欢的男孩结婚也可以和她朋友喜欢的男孩结婚, 并且朋友关系可以传递 Once every gi ...

  4. HDU 3277 Marriage Match III(并查集+二分+最大流)

    题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮 思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢 ...

  5. [kuangbin带你飞]专题十一 网络流\N HDU 3081 Marriage Match II

    题目描述 Presumably, you all have known the question of stable marriage match. A girl will choose a boy; ...

  6. HDU - 3081 Marriage Match II(二分+并查集+最大流/匈牙利删边)

    题目链接:点击查看 题目大意:n个男生和n个女生配对,配对规则如下: 每个女生都可以选择没有吵过架的男生匹配 若女生A的好朋友是女生B,且女生B没有和男生C吵过架,则女生A也可以和男生C匹配 现在问最 ...

  7. HDU - 3081 Marriage Match II 【二分匹配】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意 有n对男女 女生去选男朋友 如果女生从来没和那个男生吵架 那么那个男生就可以当她男朋友 女 ...

  8. HDU 3081 Marriage Match II (并查集+二分+最大流 | 并查集+二分图匹配)

    题意:n 个男生.n个女生玩游戏,每个女生都可以和她不讨厌的男生结婚,此外她的朋友如果也不讨厌这个男生,也可以和他结婚:对于女生,如果A和B是朋友,B和C是朋友,那么A和C也是朋友.每次游戏女生会找一 ...

  9. 【HDU - 3081】Marriage Match II(网络流最大流,二分+网络流)

    题干: Presumably, you all have known the question of stable marriage match. A girl will choose a boy; ...

最新文章

  1. smarty mysql demo_PHP Smarty模版简单使用方法
  2. 以太坊RLP编码规则
  3. MIT自然语言处理第三讲:概率语言模型(第一、二、三部分)
  4. Kafka的基本介绍和在linux的安装配置
  5. (筆記) 如何為ModelSim加入永久性的library mapping? (SOC) (ModelSim)
  6. 0-1背包问题(需要输出具体背包序号)
  7. python模拟登录新浪微博自动获得调用新浪api所需的code
  8. Codeforces Round #187 (Div. 2) D
  9. nema0183 java解析_java解析nmea0183协议
  10. python 生成式 生成器
  11. Java开源CMS系统
  12. 把一个代表DateTime带有T和Z的string转化成DateTime c#
  13. 【已解决】抖音如何取消关注已注销的账户
  14. 微信小程序——商品列表
  15. 字符转换 提取一个字符串中的所有数字字符('0'……'9'),将其转换为一个整数输出。 首位不能是0
  16. Java常见面试题_理论+实践
  17. android SystemUI 流程分析
  18. shell-login-session-环境设置流程
  19. REST协议解密(原创)
  20. 毕节一中2021高考成绩查询,毕节第一中学2021年招生录取分数线

热门文章

  1. 解决问题的能力 > 10倍程序员
  2. android自动化测试--appium运行的坑问题及解决方法
  3. 启动程序端口被占用Address already in use: bind解决方案
  4. 无法加载身份验证插件“ caching_sha2_password”
  5. 有没有办法为Node.js项目自动构建package.json文件
  6. 自定义action消息
  7. activiti并行网关
  8. windows操作系统_国产Linux操作系统体验:易用性不比Windows差,但输在这点上
  9. ros indigo 学习笔记
  10. linux锁定系统时间设置,Linux时间设置系统时间、硬件时间和时间服务