码迷,mamicode.com
首页 > 其他好文 > 详细

最短路问题

时间:2018-10-01 19:54:45      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:tar   space   can   sizeof   std   alt   end   size   邻接表   

第一种是不优化的dijiesitela算法,用邻接表输入。

技术分享图片

#include<cstdio>
const int maxm = 105;
const int INF = 1e5 + 5;
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int mapp[maxm][maxm];
bool vis[maxm];
int dp[maxm];
char ch[maxm];
int v;
queue<int> q;
void Dijstela(int star, int endd){
    int minn;
    int index;
memset(vis, 0, sizeof(vis));
vis[star] = 1;
dp[star] = 0;
for(int i = 0; i < v; i++){
    dp[i] = mapp[star][i];
}
for(int i = 0; i < v - 1; i++){
        minn = INF;
        for(int j = 0; j < v; j++)
        {
            if(dp[j] < minn && !vis[j])找到最小的
            {
                index = j;
                minn = dp[j];
            }
        }
        if(minn == INF) break;
        //说明这些点的集合与其他点之间没有联通的地方。
        q.push(index);
        vis[index] = 1;
        for(int j = 0; j < v; j++)更新每个点的最短路径
        {
            if(dp[index] + mapp[index][j] < dp[j] && !vis[j])
            dp[j] = dp[index] + mapp[index][j];
        }
    }
}
int main(){
scanf("%s", ch);
memset(dp, 0, sizeof(dp));
v = strlen(ch);
for(int i = 0; i < v; i++){
        if(i == v - 1) printf("%c\n", ch[i]);
else
    printf("%c ", ch[i]);
}
for(int i = 0; i < v; i++){
    for(int j = 0; j < v; j++){
        scanf("%d", &mapp[i][j]);
    }
}
for(int i = 0; i < v; i++){
    for(int j = 0; j < v; j++){
        mapp[i][j] = mapp[i][j] == 0 ? INF : mapp[i][j];
    }
}
q.push(3);
Dijstela(3, 0);
printf("%d\n", dp[0] == INF ? -1 : dp[0]);
while(!q.empty()){
    int yuan = q.front();
    q.pop();
    printf("%c ", yuan + A);
}
return 0;
}

 

最短路问题

标签:tar   space   can   sizeof   std   alt   end   size   邻接表   

原文地址:https://www.cnblogs.com/downrainsun/p/9735458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!