最短路径的条数
ecttx 2012-12-22 08:02:14
题目描述:求出有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;
}