- 浏览: 389225 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
wsyzyrxp:
非常感谢 兄弟 帮了我大忙
[opengl]弹簧质点法模拟柔性布料以及椭球碰撞的opengl实现 -
mingdry0304:
[opengl]彩色立方体旋转 -
tyfengyu:
我刚刚更改的代码加上了标准差stdVal,故recoMat应该 ...
[python]用python实现的pca算法 -
tyfengyu:
python的pca代码有2处错误:1.finalData = ...
[python]用python实现的pca算法 -
暴风雪:
McFlurry 写道前排(凑字数)!擦你怎么摸来这里的
诈尸总结
大致题意:
给出一个由n个节点,m条边组成的无向图,每条边都有各自的长度和一个花费值c,意味着删去这条无向边需要的花费。给出两个点s和t,现在要删去一些边使得s到t的最短路增加,求花费最少是多少。
大致思路:
首先,对于一条边(u,v),如果s—>v== s—>u +u—>v我们就可以认为这条边是s到t的最短路上面的一条边。用dijkstra先求出s到所有点的最短距离,然后枚举每条边用上面的方法判定这条边是否在最短路上。如果(u,v)是属于某个最短路的一条边,则在网络图中加上u->v,容量设为删去这条边的花费。接下来对图中的s点到t点求一遍最小割,得到的就是答案。
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; const int nMax=1500; const int mMax=200000; class node{ public: int c,u,v,next; };node edge[mMax]; int ne, head[nMax],n; int cur[nMax], ps[nMax], dep[nMax]; const int inf=1<<29; void addedge(int u, int v,int c){ ////dinic的加边方法 // cout<<u<<" add "<<v<<" "<<c<<endl; edge[ne].u = u; edge[ne].v = v; edge[ne].c = c; edge[ne].next = head[u]; head[u] = ne ++; edge[ne].u = v; edge[ne].v = u; edge[ne].c = 0; edge[ne].next = head[v]; head[v] = ne ++; } int dinic(int s, int t){ // 网络流dinic算法。 int tr, res = 0; int i, j, k, f, r, top; while(1){ memset(dep, -1, sizeof(dep)); for(f = dep[ps[0]=s] = 0, r = 1; f != r;) for(i = ps[f ++], j = head[i]; j; j = edge[j].next) if(edge[j].c && dep[k=edge[j].v] == -1){ dep[k] = dep[i] + 1; ps[r ++] = k; if(k == t){ f = r; break; } } if(dep[t] == -1) break; memcpy(cur, head, sizeof(cur)); i = s, top = 0; while(1){ if(i == t){ for(tr =inf, k = 0; k < top; k ++) if(edge[ps[k]].c < tr) tr = edge[ps[f=k]].c; for(k = 0; k < top; k ++) { edge[ps[k]].c -= tr; edge[ps[k]^1].c += tr; } i = edge[ps[top=f]].u; res += tr; } for(j = cur[i]; cur[i]; j = cur[i] =edge[cur[i]].next){ if(edge[j].c && dep[i]+1 == dep[edge[j].v]) break; } if(cur[i]){ ps[top ++] = cur[i]; i = edge[cur[i]].v; } else{ if(top == 0) break; dep[i] = -1; i = edge[ps[-- top]].u; } } } return res; } int map[nMax][nMax],co[nMax][nMax],dis[nMax]; bool vis[nMax]; void dijkstra(int from){ for(int i=0;i<=n;i++)dis[i]=inf; memset(vis,false,sizeof(vis)); vis[from]=true; dis[from]=0; int mine; int now=from; for(int i=1;i<n;i++){ for(int k=1;k<=n;k++) if( map[now][k]!=inf&&dis[now]!=inf&&map[now][k]+dis[now]<dis[k]) dis[k] = dis[now] + map[now][k]; mine=inf; for(int k=1;k<=n;k++) if(mine>dis[k]&&!vis[k]) mine=dis[now=k]; vis[now]=true; } // for(int i=1;i<=n;i++)cout<<dis[i]<<" ";cout<<endl; } void buildmap(int s,int t,int N){ int i,j; for(i=1;i<=N;i++){ if(dis[i]==inf)continue; for(j=1;j<=N;j++){ if(i==j)continue; if(dis[j]==dis[i]+map[i][j])addedge(i,j,co[i][j]); } } } int main(){ int i,j,m,a,b,c,s,t,u,v,cas=0; while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){ cas++; ne=2; memset(head,0,sizeof(head)); scanf("%d%d",&s,&t); for(i=1;i<=n;i++){ for(j=0;j<=n;j++){ map[i][j]=inf; }map[i][i]=0; } while(m--){ scanf("%d%d",&u,&v); scanf("%d%d",&a,&b); if(a>map[u][v])continue; if(a==map[u][v]){ co[u][v]+=b; co[v][u]+=b; continue; } map[u][v]=a; co[v][u]=co[u][v]=b; map[v][u]=map[u][v]; } dijkstra(s); if(dis[t]==inf){ printf("Case %d: %d\n",cas,0); continue; } buildmap(s,t,n); printf("Case %d: %d\n",cas,dinic(s,t)); } return 0; }
发表评论
-
[kruskal]hdoj 4786
2014-10-29 20:38 703大致题意: 一个无向图中,每条边都是白边或 ... -
[prim]aizuoj:There is No Alternative
2014-10-20 01:02 884题目地址:http://judge.u-aizu.ac.j ... -
[最大流唯一性判断]hdoj 4888
2014-10-18 16:14 1359题意 给出一个矩阵n行每一行数字的和,m列每列数字的 ... -
[双连通分量+队列优化dijkstra]acdream 1415
2014-10-16 04:03 1140题意: 给出一个n个点,m条边无向图(2 ≤ ... -
[2-sat]hdoj 4751
2014-10-10 21:06 815大致题意 给出一个有向图,问这个图是否能分为两个完全图 ... -
[费用流]hdoj 5045
2014-09-28 00:11 868读题的时候漏掉了“题目是按照顺序出现的”,导致网络赛中这道题 ... -
[dfs+bfs]zoj 3811
2014-09-21 09:59 980题意: 在一个无向图中,能否按照一定的顺序访问图 ... -
[二分+最大流]zoj 3691:flower
2013-04-01 21:05 1671大致题意: 在一个三维空间中有n个点,每个点的坐标 ... -
[spfa]hdoj 4460:Friend Chains
2012-11-08 21:15 1688大致题意: 一个无向图n个点,m条边,求任意两个点之 ... -
[二分匹配]zoj 3156:Taxi
2012-10-25 19:28 1166大致题意: 有n个人和m辆车(n<=m)。给出所有 ... -
[Tarjan]uva 4846:Mines
2012-10-19 10:07 1305大致题意: 给出n个地雷,每颗地雷有一个爆炸范围,这 ... -
[2-sat][位运算]zoj 3656:Bit Magic
2012-10-15 09:17 2035大致题意: 给出下面一段代码 很明显这段代码是 ... -
[二分匹配]zoj 3646:Matrix Transformer
2012-10-10 21:15 1053大致题意: 给出一个n*n的矩阵,每个矩阵元素的U或者 ... -
[拆点+网络流]2012 acm/icpc成都网络赛 hdoj 4292:Food
2012-09-16 17:15 2324大致题意: 有F种食物和D种饮料,每种食物或饮料只能 ... -
[网络流]2012 acm/icpc成都网络赛hdoj 4288:Control
2012-09-16 17:03 1354大致题意: 给出一个又n个点,m条边组成的无向图。给出两 ... -
[floyd+Tarjan]zoj 3232:It's not Floyd Algorithm
2012-09-09 09:49 1139大致题意: 给出一个有向图的传递闭包矩阵,求出这个图 ... -
[最大流]zoj 3642:Just Another Information Sharing Problem
2012-08-28 13:26 1145大致题意: 有n个人,每个人知道ai个消息,并且会 ... -
[Tarjan变形]zoj 3630:Information
2012-08-15 16:42 1156大致题意: 给出一个有向图,现在要删去一个点使得剩下的图 ... -
[Tarjan强连通分量]hdoj 3836:Equivalent Sets
2012-07-21 09:40 966大致题意: 就是给出一个有向图,求最少加多少条边可以 ... -
[最大流]zoj 3305:Get Sauce
2012-06-19 10:04 973大致题意: 有n种原材料,每种一件。现在给出m个组合 ...
相关推荐
基于Pyqt5+Dijkstra算法实现的校园地图导览python源码 基于Pyqt5+Dijkstra算法实现的校园地图导览python源码 基于Pyqt5+Dijkstra算法实现的校园地图导览python源码 基于Pyqt5+Dijkstra算法实现的校园地图导览python...
毕设项目:基于springboot+mysql+Dijkstra算法实现物流优化管理系统.zip主要针对计算机相关专业的正在做课程设计和期末大作业的学生和需要项目实战练习的学习者。包含全部项目源码、该项目可以直接使用、项目都经过...
基于java+dijkstra算法实现上海地铁换乘线路的查询+源码+实现原理解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于java+dijkstra算法实现上海地铁换乘...
毕设项目:基于springboot+mysql+Dijkstra算法实现物流优化管理系统 本资源中的源码都是经过本地编译过可运行的,下载后按照文档配置好环境就可以运行。资源项目的难度比较适中,内容都是经过专业老师审定过的,...
1、基于springboot+mysql+Dijkstra算法实现物流优化管理系统源码+项目说明(课程设计).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大...
【作品名称】:基于Matlab+Dijkstra和时间窗规划的AGV调度算法 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于...
标题中的“最短路径+dijkstra+matlab代码+算法效率测试”揭示了本文将要讨论的是图论中的一个经典算法——Dijkstra算法,并且在MATLAB环境下实现与测试该算法的效率。MATLAB是一款强大的数学计算软件,常用于科学...
AGV调度_基于Matlab+Dijkstra算法+时间窗规划实现的AGV调度算法_附项目源码_优质项目实战
基于Pyqt5+Dijkstra算法实现的校园地图导览python源码+项目使用说明.zip 语言:Python 主要依赖包: PyQt5 主要算法: Dijkstra 通过工程文件 - > 在配置好的IDE中运行 main.py - > 或cd 进入工程目录 python -...
在这个项目中,"标准C的图的实现+BFS和DFS遍历+Dijkstra算法+Prim算法+Kruskal算法实现"涵盖了图的多种核心操作和算法。接下来,我们将详细讨论这些知识点。 首先,我们来看图的实现。在标准C语言中,图可以使用...
Dijkstra算法可以解决voronoi图中求解最短路径
在IT领域,路径规划是一项关键任务,特别是在机器人学、计算机科学和网络优化中。本文将深入探讨两种在路径规划中常用的算法:蚁群算法(Ant Colony Optimization, ACO)和Dijkstra算法,并介绍如何在MATLAB环境中...
dijkstra算法
Dijkstra算法,由荷兰计算机科学家Edsger W. Dijkstra提出,是一种用于查找图中两个节点之间最短路径的经典算法。它通过维护一个节点集合,每次扩展距离起点最近的未访问节点,直到到达目标节点。Dijkstra算法保证...
Dijkstra算法,由荷兰计算机科学家艾兹格·迪科斯彻提出,是一种用于寻找图中两点间最短路径的算法。它采用贪心策略,每次选取当前未访问节点中距离起点最近的一个节点,并更新所有与之相邻节点的最短路径。Dijkstra...