邻接表模板+最短路径dfs

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <malloc.h>
using namespace std;
const int maxn=5005;
const int INF=0x7fffffff;
struct edge
{
    int fin; //终点城市
    int len; //路的长度
    //如果有其他信息可以加上
    edge * next;
};
struct city
{
    edge *e;
};
city c[maxn];
int n,m;
//邻接表的遍历
void traverse ()
{
    for (int i=0;i<n;i++)
    {
         edge *temp=c[i].e;
        while (temp)
        {
            printf("%d->%d\n",i,temp->fin);
            temp=temp->next;
        }
    }
}
//求从1到n的最短路径
int minn=INF;
//建立vis数组标记是否经过。
int vis[maxn];
//求最短路径
void dfs (int loc,int slen)
{
    if(slen>minn)
        return;
    if(loc==n)
    {
        minn=min(minn,slen);
        return;
    }
    edge * temp=c[loc].e;
    while (temp)
    {
        if(!vis[temp->fin])
        {
            vis[temp->fin]=1;
            dfs (temp->fin,slen+temp->len);
            vis[temp->fin]=0;
        }
        temp=temp->next;
    }
}
int main()
{
    scanf("%d%d",&n,&m);//n座城市,m条边;
    for (int i=0;i<n;i++)
           c[i].e=NULL;  //初值赋值为NULL;
    for (int i=0;i<m;i++)
    {
        int beg,fin,len;
        scanf("%d%d%d",&beg,&fin,&len);   //邻接表的创建。这里是无向图。
        edge* e1=(edge*)malloc(sizeof(edge));
        edge* e2=(edge*)malloc(sizeof(edge));
        e1->fin=fin;
        e1->next=c[beg].e;
        e1->len=len;
        c[beg].e=e1;
        e2->fin=beg;
        e2->next=c[fin].e;
        e2->len=len;
        c[fin].e=e2;
    }
    traverse();
    memset (vis,0,sizeof(vis));
    dfs(1,0);
    printf("%d\n",minn);
    return 0;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值