dfs 深搜
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<queue>
using namespace std;
queue<int> q;
int e[100][100], v[100];
int n, m, a, b, c, mi = 999999;
void dfs(int cur, int dis)//当前城市编号,当前已走过的路程
{
//if(dis > mi) return ;//减少运行时间
if(cur == n)
{
if(dis < mi)
mi = dis;
return;
}
for(int i=1; i<=n; i++)//从1到n号城市尝试
{
if(e[cur][i] != 999999 && v[i] == 0)
{
v[i] = 1;
dfs(i, dis + e[cur][i]);
v[i] = 0;
}
}
}
int main()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=n;i++)//有几个城市
for(int j=1; j<=n; j++)//n*n阶二维矩阵
{
if(i==j) e[i][j] = 0;
else e[i][j] = 999999;
}
for(int i=1; i<=m; i++)//有几条边
{
scanf("%d%d%d", &a, &b, &c);
e[a][b] = c;
e[b][a] = c;
}
v[1] = 1;//从一号城市出发 标志
dfs(1, 0);//城市编号 路程
printf("%d", mi);
return 0;
}
bfs 宽搜
#include <iostream>
#include <queue>
#include <map>
using namespace std;
int n, m, start, endd,f=0, a, b,mu;
int e[100][100], v[100];
struct po
{
int x, y;//城市编号, 次数
};
void bfs()
{
queue<po> q;
q.push({start, 0});
v[start]=1;
while(q.size())
{
int t = q.front().x;
int j = q.front().y;
if(t == endd)
{
cout<<j<<endl;
break;//如果到达目的地,停止拓展
}
for(int i=1;i<=n;i++)
{
if(e[t][i] != 999999 && v[i] ==0)
{
po temp;
temp.x = i;//更新
temp.y = j + 1;
q.push(temp);
v[i]=1;
}
}
// if(f==1) break;//次数保存在队列中,最后一次不用出队
q.pop();
}
}
int main()
{
cin>>n>>m>>start>>endd;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j) e[i][j] =0;
else e[i][j] = 999999;
for(int i=1;i<=m;i++)
{
cin>>a>>b;
e[a][b] = 1;
e[b][a] = 1;
}
bfs();
return 0;
}