#include <stdio.h>
#include <stdlib.h>
int n,m,s,d;
int dis[500][500],cost[500][500];
int min_dis=99999999,min_cost=99999999;
int stack[500],top=0;//定义一个栈,存储到达当前顶点的路径
int path[500],len;//存储可能作为最短路径的路径
int isNotStack(int n)//此函数判断顶点是否在栈里
{
int i;
for(i=0; i<top; i++)
{
if(stack[i]==n) return 0;
}
return 1;
}
void dfs(int point,int now_dis,int now_cost)
{
int i;
//printf("进入了顶点%d\n",point);
stack[top]=point;
top++;//进入了顶点point,将其入栈
if(now_dis>min_dis) //当前路径已经过长,应该返回
{
return;
}
if(point==d) //如果是终点
{
if(now_dis<min_dis||(now_dis==min_dis&&now_cost<min_cost)) //如果更优
{
min_cost=now_cost;
min_dis=now_dis;
for(i=0; i<top; i++) //把栈里的路径保存下来
{
path[i]=stack[i];
}
len=top;
}
}
else//如果不是终点,往下遍历
{
for(i=0; i<n; i++)
{
if(dis[point][i]!=-1&&i!=point&&isNotStack(i))//到顶点i有路径,且不在栈里
{
dfs(i,now_dis+dis[point][i],now_cost+cost[point][i]);
top--;//从顶点i返回,应将其出栈,即栈顶减一
}
}
}
}
int main()
{
int i,j,temp_d,temp_c;
for(i=0; i<500; i++)
for(j=0; j<500; j++) dis[i][j]=-1;//dis初始化,-1代表没有路径
scanf("%d%d%d%d",&n,&m,&s,&d);
while(m--)
{
scanf("%d%d%d%d",&i,&j,&temp_d,&temp_c);
dis[i][j]=dis[j][i]=temp_d;
cost[i][j]=cost[j][i]=temp_c;
}
dfs(s,0,0);
for(i=0; i<len; i++) printf("%d ",path[i]);
printf("%d ",min_dis);
printf("%d",min_cost);
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交