代码如下:
#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;
}