博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于 最短路条数 和 边不可重复最短路条数问题 /hdu3599(边不可重复最短路)...
阅读量:7219 次
发布时间:2019-06-29

本文共 3364 字,大约阅读时间需要 11 分钟。

    原先一直在做一道省赛题,由于题意错误理解成球最短路条数,误打误撞敲了最短路条数,又发现hdu3599(多校)求边不可重复最短路条数。下面说说俩种问题解法:

最短路条数:

         求一个图一共一几条最短路径,思路:先从终点跑一边最短路,记录终点到到所有点最短距离(d【i】),然后从起点出发,dfs 按d[i]走(必是最短路径),一句话:我到终点的最短路条数=我的所有孩子到终点的最短路条数之和,这样只需一遍即可。这不知道是不是叫记忆化搜索?

边不可重复最短路径条数:(最短路+建新图之最大流)

       hdu3599题意:求1-->n最短路条数,所有路径边不可重复。思路:边不可重复??!!转为流量的为1 的话,求最大流啊(以后切记该方法,不可重复问题转最大流)!于是:先跑一遍最短路(随便从起点还是终点),然后按老图中是最短路的边就在新图添加一条边,权为1,这样的话,从起点到终点跑最大流即为答案。

 附代码:问题一:

#include
#include
#include
using namespace std;int n;int e[100000][3];int head[2000];int nume=0;int d[2000];const int inf =0x3f3f3f3f;int vis[2000];int inq[2000];void adde(int a,int b,int w){ e[nume][0]=b;e[nume][1]=head[a];head[a]=nume; e[nume++][2]=w; e[nume][0]=a;e[nume][1]=head[b];head[b]=nume; e[nume++][2]=w;}void spfa() //一遍求出终点到所有点的最短路长度d[i]。{ queue
q; int start; start=n; inq[start]=1; q.push(start); d[start]=0; while(!q.empty()) { int cur=q.front(); q.pop(); inq[cur]=0; for(int i=head[cur];i!=-1;i=e[i][1]) { int v=e[i][0]; if(d[cur]+e[i][2]
>ta; while(ta--) { scanf("%d",&n); int aa,bb,cc; for(int i=0;i<=n;i++) { head[i]=-1; nowd[i]=d[i]=inf; inq[i]=counted[i]=vis[i]=0; } nume=0; while(~scanf("%d%d%d",&aa,&bb,&cc)&&(aa||bb||cc)) adde(aa,bb,cc); spfa(); counted[n]=1; nowd[1]=0; vis[1]=1; cout<
<
问题2:

#include
#include
#include
using namespace std;int n;int e[2260000][3];int head[1510];int nume=0;int d[1510];const int inf =0x3f3f3f3f;int inq[1510];void adde(int a,int b,int w) //原图{ e[nume][0]=b;e[nume][1]=head[a];head[a]=nume; e[nume++][2]=w; e[nume][0]=a;e[nume][1]=head[b];head[b]=nume; e[nume++][2]=w;}int ee[2260000][3];int head2[1510]; //新图void adde2(int a,int b){ ee[nume][0]=b;ee[nume][1]=head2[a];head2[a]=nume; ee[nume++][2]=1; ee[nume][0]=a;ee[nume][1]=head2[b];head2[b]=nume; ee[nume++][2]=0;}void spfa() //求出终点到所有点的最短路长度d[i]。{ queue
q; int start; start=n; inq[start]=1; q.push(start); d[start]=0; while(!q.empty()) { int cur=q.front(); q.pop(); inq[cur]=0; for(int i=head[cur];i!=-1;i=e[i][1]) { int v=e[i][0]; if(d[cur]+e[i][2]
q; q.push(1); vis[1]=1; while(!q.empty()) { int cur=q.front(); q.pop(); for(int i=head2[cur];i!=-1;i=ee[i][1]) { int v=ee[i][0]; if(!vis[v]&&ee[i][2]>0) { lev[v]=lev[cur]+1; if(v==n) return 1; vis[v]=1; q.push(v); } } } return vis[n];}int dfs(int u,int minf){ if(u==n||minf==0)return minf; int sumf=0,f; for(int i=head2[u];i!=-1&&minf;i=ee[i][1]) { int v=ee[i][0]; if(ee[i][2]>0&&lev[v]==lev[u]+1) { f=dfs(v,ee[i][2]
>ta; while(ta--) { scanf("%d",&n); int aa,bb,cc; for(int i=0;i<=n;i++) { head[i]=-1; nowd[i]=d[i]=inf; inq[i]=vis[i]=0; } nume=0; while(~scanf("%d%d%d",&aa,&bb,&cc)&&(aa||bb||cc)) adde(aa,bb,cc); if(n==1){cout<<0<
附几组数据:

5

1 2 1
2 3 1
3 5 1
1 3 2
1 4 2
3 4 2
0 0 0
4
1 0 2
2 0 2
1 3 1
2 3 3
2 4 1
1 2 4
0 0 0
6
1 2 1
3 2 1
3 4 1
1 3 2
4 2 2
4 5 1
5 6 1
4 6 2
0 0 0
1
0 0 0   

转载于:https://www.cnblogs.com/yezekun/p/3925711.html

你可能感兴趣的文章
Algernon's Noxious Emissions POJ1121 zoj1052
查看>>
iOS-数据持久化-对象归档
查看>>
iOS开发UI篇—程序启动原理和UIApplication
查看>>
MUI 里js动态添加数字输入框后,增加、减少按钮无效
查看>>
python pip 更换国内安装源(windows)
查看>>
结对编程2后篇
查看>>
oracle exp 和 imp 数据和表结构互相独立导出导入
查看>>
iphone-common-codes-ccteam源代码 CCNSPredicate.m
查看>>
这次项目中应该注意的问题和应该保持的好习惯
查看>>
python-数据结构化与保存
查看>>
LeetCode - 551. Student Attendance Record I
查看>>
Java用户线程和守护线程
查看>>
ClassLoader类加载机制&&JVM内存管理
查看>>
Caml语句 查询分配给当前用户及当前组
查看>>
记一次源码分析
查看>>
php版本引起的const问题
查看>>
js实现60s倒计时效果
查看>>
【POJ 2176】Folding
查看>>
redis的过期策略以及内存淘汰机制
查看>>
阿牛的EOF牛肉串
查看>>