HDU 3416 Marriage Match IV
最短路+最大流
#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相关推荐
- HDU - 3416 Marriage Match IV(最大流+最短路)
题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无环有向图,有自环,有重边,现在给出起点st和终点ed,问从st到ed共有多少条最短路,每条路最多只能经过一次 题目分析:看完题意后感觉是要 ...
- SPFA+Dinic HDOJ 3416 Marriage Match IV
题目传送门 题意:求A到B不同最短路的条数(即边不能重复走, 点可以多次走) 分析:先从A跑最短路,再从B跑最短路,如果d(A -> u) + w (u, v) + d (B -> v) ...
- HDU 3081 Marriage Match II【并查集+二分图最大匹配】
大意:有n个男孩n个女孩,告诉你每个女孩喜欢哪些男孩,又告诉你女孩之间的存在一些朋友关系 一个女孩可以和她喜欢的男孩结婚也可以和她朋友喜欢的男孩结婚, 并且朋友关系可以传递 Once every gi ...
- HDU 3277 Marriage Match III(并查集+二分+最大流)
题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮 思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢 ...
- [kuangbin带你飞]专题十一 网络流\N HDU 3081 Marriage Match II
题目描述 Presumably, you all have known the question of stable marriage match. A girl will choose a boy; ...
- HDU - 3081 Marriage Match II(二分+并查集+最大流/匈牙利删边)
题目链接:点击查看 题目大意:n个男生和n个女生配对,配对规则如下: 每个女生都可以选择没有吵过架的男生匹配 若女生A的好朋友是女生B,且女生B没有和男生C吵过架,则女生A也可以和男生C匹配 现在问最 ...
- HDU - 3081 Marriage Match II 【二分匹配】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意 有n对男女 女生去选男朋友 如果女生从来没和那个男生吵架 那么那个男生就可以当她男朋友 女 ...
- HDU 3081 Marriage Match II (并查集+二分+最大流 | 并查集+二分图匹配)
题意:n 个男生.n个女生玩游戏,每个女生都可以和她不讨厌的男生结婚,此外她的朋友如果也不讨厌这个男生,也可以和他结婚:对于女生,如果A和B是朋友,B和C是朋友,那么A和C也是朋友.每次游戏女生会找一 ...
- 【HDU - 3081】Marriage Match II(网络流最大流,二分+网络流)
题干: Presumably, you all have known the question of stable marriage match. A girl will choose a boy; ...
最新文章
- smarty mysql demo_PHP Smarty模版简单使用方法
- 以太坊RLP编码规则
- MIT自然语言处理第三讲:概率语言模型(第一、二、三部分)
- Kafka的基本介绍和在linux的安装配置
- (筆記) 如何為ModelSim加入永久性的library mapping? (SOC) (ModelSim)
- 0-1背包问题(需要输出具体背包序号)
- python模拟登录新浪微博自动获得调用新浪api所需的code
- Codeforces Round #187 (Div. 2) D
- nema0183 java解析_java解析nmea0183协议
- python 生成式 生成器
- Java开源CMS系统
- 把一个代表DateTime带有T和Z的string转化成DateTime c#
- 【已解决】抖音如何取消关注已注销的账户
- 微信小程序——商品列表
- 字符转换 提取一个字符串中的所有数字字符('0'……'9'),将其转换为一个整数输出。 首位不能是0
- Java常见面试题_理论+实践
- android SystemUI 流程分析
- shell-login-session-环境设置流程
- REST协议解密(原创)
- 毕节一中2021高考成绩查询,毕节第一中学2021年招生录取分数线
热门文章
- 解决问题的能力 > 10倍程序员
- android自动化测试--appium运行的坑问题及解决方法
- 启动程序端口被占用Address already in use: bind解决方案
- 无法加载身份验证插件“ caching_sha2_password”
- 有没有办法为Node.js项目自动构建package.json文件
- 自定义action消息
- activiti并行网关
- windows操作系统_国产Linux操作系统体验:易用性不比Windows差,但输在这点上
- ros indigo 学习笔记
- linux锁定系统时间设置,Linux时间设置系统时间、硬件时间和时间服务