最短路径的条数

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;



}
...全文
282 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
方品 2014-12-10
  • 打赏
  • 举报
回复
比如刚做了一题求1到n的最短路径及条数 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <vector> #include <map> #include <algorithm> using namespace std; int cost[101][101],path[101][101],low[101],dis[101],num[101]={}; bool vis[101]; const int MAXN=10000001; int main() { int n,m,i,j,k; memset(vis,false,sizeof(vis)); scanf("%d%d",&n,&m); for(i=0;i<101;++i){ for(j=0;j<101;++j){ cost[i][j]=MAXN; } } for(i=0;i<m;++i){ int a,b,c; scanf("%d%d%d",&a,&b,&c); cost[a][b]=c; path[a][b]++; } vis[1]=true; for(i=2;i<=n;++i) low[i]=cost[1][i]; for(i=2;i<=n;++i){ int minn=MAXN+1; for(j=1;j<n;++j){ if(!vis[j] && low[j]<minn){ minn=low[j];k=j; } } vis[k]=true; for(j=1;j<=n;++j){ if(!vis[j]){ low[j]=min(low[j],low[k]+cost[k][j]); } } } memset(vis,false,sizeof(vis)); vis[1]=true; for(i=2;i<=n;++i) dis[i]=cost[1][i]; for(i=2;i<=n;++i) if(dis[i]==low[i]) num[i]=path[1][i]; for(i=2;i<=n;++i){ int minn=MAXN+1; for(j=1;j<=n;++j){ if(!vis[j] && dis[j]<minn){ minn=dis[j];k=j; } } vis[k]=true; for(j=1;j<=n;++j){ if(!vis[j]){ dis[j]=min(dis[j],dis[k]+cost[k][j]); } if(dis[k]+cost[k][j]==low[j]) num[j]+=num[k]*path[k][j]; } } if(low[n]>=MAXN) printf("-1 0\n"); else printf("%d %d\n",low[n],num[n]); return 0; }
方品 2014-12-10
  • 打赏
  • 举报
回复
比如刚做了一题求1到n的最短路径及条数 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <vector> #include <map> #include <algorithm> using namespace std; int cost[101][101],path[101][101],low[101],dis[101],num[101]={}; bool vis[101]; const int MAXN=10000001; int main() { int n,m,i,j,k; memset(vis,false,sizeof(vis)); scanf("%d%d",&n,&m); for(i=0;i<101;++i){ for(j=0;j<101;++j){ cost[i][j]=MAXN; } } for(i=0;i<m;++i){ int a,b,c; scanf("%d%d%d",&a,&b,&c); cost[a][b]=c; path[a][b]++; } vis[1]=true; for(i=2;i<=n;++i) low[i]=cost[1][i]; for(i=2;i<=n;++i){ int minn=MAXN+1; for(j=1;j<n;++j){ if(!vis[j] && low[j]<minn){ minn=low[j];k=j; } } vis[k]=true; for(j=1;j<=n;++j){ if(!vis[j]){ low[j]=min(low[j],low[k]+cost[k][j]); } } } memset(vis,false,sizeof(vis)); vis[1]=true; for(i=2;i<=n;++i) dis[i]=cost[1][i]; for(i=2;i<=n;++i) if(dis[i]==low[i]) num[i]=path[1][i]; for(i=2;i<=n;++i){ int minn=MAXN+1; for(j=1;j<=n;++j){ if(!vis[j] && dis[j]<minn){ minn=dis[j];k=j; } } vis[k]=true; for(j=1;j<=n;++j){ if(!vis[j]){ dis[j]=min(dis[j],dis[k]+cost[k][j]); } if(dis[k]+cost[k][j]==low[j]) num[j]+=num[k]*path[k][j]; } } if(low[n]>=MAXN) printf("-1 0\n"); else printf("%d %d\n",low[n],num[n]); return 0; }
方品 2014-12-10
  • 打赏
  • 举报
回复
比如刚做了一题求1到n的最短路径及条数 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <vector> #include <map> #include <algorithm> using namespace std; int cost[101][101],path[101][101],low[101],dis[101],num[101]={}; bool vis[101]; const int MAXN=10000001; int main() { int n,m,i,j,k; memset(vis,false,sizeof(vis)); scanf("%d%d",&n,&m); for(i=0;i<101;++i){ for(j=0;j<101;++j){ cost[i][j]=MAXN; } } for(i=0;i<m;++i){ int a,b,c; scanf("%d%d%d",&a,&b,&c); cost[a][b]=c; path[a][b]++; } vis[1]=true; for(i=2;i<=n;++i) low[i]=cost[1][i]; for(i=2;i<=n;++i){ int minn=MAXN+1; for(j=1;j<n;++j){ if(!vis[j] && low[j]<minn){ minn=low[j];k=j; } } vis[k]=true; for(j=1;j<=n;++j){ if(!vis[j]){ low[j]=min(low[j],low[k]+cost[k][j]); } } } memset(vis,false,sizeof(vis)); vis[1]=true; for(i=2;i<=n;++i) dis[i]=cost[1][i]; for(i=2;i<=n;++i) if(dis[i]==low[i]) num[i]=path[1][i]; for(i=2;i<=n;++i){ int minn=MAXN+1; for(j=1;j<=n;++j){ if(!vis[j] && dis[j]<minn){ minn=dis[j];k=j; } } vis[k]=true; for(j=1;j<=n;++j){ if(!vis[j]){ dis[j]=min(dis[j],dis[k]+cost[k][j]); } if(dis[k]+cost[k][j]==low[j]) num[j]+=num[k]*path[k][j]; } } if(low[n]>=MAXN) printf("-1 0\n"); else printf("%d %d\n",low[n],num[n]); return 0; }

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧