最短路径的条数
题目描述:求出有n(1 < n <= 100)个结点有向图中,结点1到结点n的最短路径,以及最短路径的条数(注意有重边)
题目地址:http://acm.cs.ecnu.edu.cn/problem.php?problemid=1818
写了一个代码,一直是wa,求指点,先描述一下思路,dfs函数是用一个stack求所有的的路径,同时记录路径长度,最后进行遍历,输出总的路径条数。
代码:#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int path[103][103];
int cost[103][103];
int stack[150],a=1,n,n1,x,y;
int s=0;
int min=1000000;
int ss[103]={0};
struct ANS
{
int val;
int sum;
}r[100000];
void dfs(int start)
{
int i,j;
int mul;
for(i=1;i<=n1;i++)
{
if(path[start][i]!=0&&ss[i]==0)
{
if(i==y)
{
mul=1;
for(j=0;j<a-1;j++)
{
r[s].val=r[s].val+cost[stack[j]][stack[j+1]];
mul=mul*path[stack[j]][stack[j+1]];
}
r[s].val=r[s].val+cost[stack[j]][y];
mul=mul*path[stack[j]][y];
r[s].sum=mul;
if(r[s].val<min)
{
min=r[s].val;
}
s++;
}
else
{
stack[a]=i;
ss[stack[a]]=1;
a++;
dfs(i);
a--;
ss[stack[a]]=0;
}
}
}
}
int main()
{
int n,m;
int i,j,t,val;
scanf("%d%d",&n,&m);
int v,res=0;
y=n;
n1=n;
for(i=0;i<103;i++)
{
for(j=0;j<103;j++)
path[i][j]=0;
}
for(i=0;i<103;i++)
{
for(j=0;j<103;j++)
cost[i][j]=0;
}
for(t=0;t<m;t++)
{
scanf("%d%d%d",&i,&j,&val);
path[i][j]=path[i][j]+1;
cost[i][j]=val;
}
stack[0]=1;
dfs(1);
for(v=0;v<s;v++)
{
if(r[v].val==min)
res=res+r[v].sum;
}
if(min<1000000)
{
printf("%d %d\n",min,res);
}
else
{
printf("-1 0\n");
}
return 0;
}
...全文
相关推荐
迷宫最短路径 数据结构
数据结构相关 广度优先算法 用C++编的
求有向图最短路径条数
求解有向图的最短路径主要有Dijkstra和Floyd算法。 求最短路径的条数问题方法类似,还可以使用dfs深度遍历的方法,易于理解但效率低,出现超时的情况。 三种方法如下: 注:前两个方法关键都需要一个数组来存储最短路径条数。 ci[i][j];//记录顶点i到j的最短路径条数 (1)Floyd算法 记录每一对顶点间的最短路径和最短路径条数。 int a[maxn]
交互网络上任意节点对的最短路径集解法 (2011年)
搜索交互网络中的最短路径是研究网络结构的重要内容,在常见的Dijkstr和Floyd算法中,只能获取一条最短路径。在交互网络上任意节点对之间的最短路径不止一条的情况下,运用Floyd算法对已知加权交互网络的最短路径进行求解,对获得最短路径后的每一个节点对,在其中插入已知交互网络中的其余所有节点,并计算此时的节点对之间的路径,通过与Floyd算法后的最短路径进行比较,筛选出构成最短路径的所有中间节点,构建路径支撑树。基于路径支撑树确定任意节点对的最短路径集,是复杂网络上搜索所有最短路径的一种新算法。
动态规划求矩阵两点最短路径
给定M*N的矩阵,其中的每个元素都是-10到10之间的整数。你的任务是从左上角(1,1)走到右下角(M,N),每一步只能够向右或者向下,并且不能够走出矩阵的范围。你所经过的方格里的数字都必须被选取,请找出一条最合适的道路,使得在路上被选取的数字之和尽可能的小。
数模经典算法(最短路径)
利用MATLAB计算最短路径的数模的算法。


