TZOJ 2731 存钱计划二 最短路/Dijstra
描述
在TZC,WY存了钱,现在他要去买东西了。店很多,标记为1,2,3,4,5,6....但有的店之间有大路相连,而有的没有路。现在要由一个店到另一个店买东西,中途最少要经过多少个其它的店铺呢?
输入
输入数据有多组,每组的第一行是两个正整数n, k(1<=n<=1000, 1<=k<=2000),接下来有k行,每行有两个正整数a, b(1 <= a, b <= n),表示店铺a和b之间有路相连,接下来一行为两个正整数p和q分别代表起始店铺。当n, k输入都为0时结束。
输出
输出从店铺p到店铺q之间最少要经过的其它的店铺的数目。如果从p无法到达q,则输出"No solution"。
样例输入
6 6
1 4
1 2
2 3
3 4
5 4
5 6
1 6
0 0
样例输出
2
Dijstra模板题
#include<bits/stdc++.h> using namespace std; const int inf = 1e9+10; int ma[1001][1001]; int dis[1001]; int vis[1001]; int n,m; /* 关于三个数组:map数组存的为点边的信息,比如map[1][2]=3,表示1号点和2号点的距离为3 dis数组存的为起始点与每个点的最短距离,比如dis[3]=5,表示起始点与3号点最短距离为5 visit数组存的为0或者1,1表示已经走过这个点。 */ int dijstra(int s,int t) { int pos = 1,min,sum=0; memset(vis,0,sizeof(vis)); memset(dis,inf,sizeof(dis)); for(int i=1;i<=n;i++) dis[i] = ma[s][i]; vis[s] = 1; dis[s] = 0; int T = n-1; while(T--) { min = inf; for(int j=1;j<=n;j++) { if(vis[j]==0&&min>dis[j]){ min = dis[j]; pos = j;//寻找当前最短路径的终点 } } vis[pos] = 1; //标记第pos个点走过 for(int j=1;j<=n;j++) { if(vis[j]==0&&dis[j]>min+ma[pos][j]) //更新dis的值 dis[j] = ma[pos][j]+min; } } return dis[t]; } int main() { while(cin>>n>>m,n,m) { memset(ma,inf,sizeof(ma)); for(int i=1;i<=m;i++){ int a,b; cin>>a>>b; ma[a][b] = ma[b][a] = 1; } int s,t; cin>>s>>t; int sum = dijstra(s,t); if(sum>1e8)cout<<"No solution"<<endl; else cout<<sum-1<<endl; } return 0; }
分类:
最短路Dijstra
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现