首页 > 编程语言 > 详细

C++ 洛谷 1261:【例9.5】城市交通路网

时间:2019-07-19 01:28:05      阅读:165      评论:0      收藏:0      [点我收藏+]

最短路径讲解

1261:【例9.5】城市交通路网

#pragma GCC optimize(2)//开O2,不用管,建议慎用(NOIP不准用)
#include<cstdio> 
#include<string>
#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
const int maxn=101;
const int inf=0x7f7f7f7f;
int n;
int map[maxn][maxn];
bool vis[maxn];
int dis[maxn];
int pre[maxn];
int f=1;
int read()
{
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){
        if(c==-)
        f=-1;
        c=getchar();
    }
    while(isdigit(c))
    {
        x=x*10+c-0;
        c=getchar();
    }
    return x*f;
}
void print(int x)//经典的输出函数
{
    if(x==0)return;
    else {
        print(pre[x]);
        printf("%d ",x+1);
    }
}
void work()
{
    n=read();
    memset(dis,inf,sizeof(dis));
    for (int i=0;i<n;i++)
    for (int j=0;j<n;j++)
    {
        map[i][j]=read();
        if(map[i][j]==0)
        map[i][j]=inf;
        else if(i==0)
        dis[j]=map[i][j];
    }
    dis[0]=0;
    //printf("minlong=%d\n",dis[n-1]);
    //printf("%d",dis[4]);
    for(int i=0;i<n;i++)
    {
        int  minn=inf,x=0;
        for (int j=0;j<n;j++)
        {
            if(!vis[j]&&minn>dis[j])
            minn=dis[j],x=j;
        }
        vis[x]=1;
        //printf("%d\n",x);
        for (int j=0;j<n;j++)
        if(map[x][j]+dis[x]<dis[j])
        {
            pre[j]=x;  //我竟然卡了输出
            dis[j]=map[x][j]+dis[x];
        }
    }
    printf("minlong=%d\n",dis[n-1]);
    printf("1 ");
    print(n-1);
}
int main()
{
    work();
    return 0;
}

 

C++ 洛谷 1261:【例9.5】城市交通路网

原文:https://www.cnblogs.com/mzyczly/p/11209763.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!