TZOJ 2731 存钱计划二 最短路/Dijstra

描述

在TZC,WY存了钱,现在他要去买东西了。店很多,标记为1,2,3,4,5,6....但有的店之间有大路相连,而有的没有路。现在要由一个店到另一个店买东西,中途最少要经过多少个其它的店铺呢?

如图例,如果他从1开始到5,那么至少要经过1个店铺,从1到4至少要经过2个店铺。

 

输入

输入数据有多组,每组的第一行是两个正整数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;
}
复制代码

 

posted @   CRt0729  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示