单源最短路径

来源:互联网 发布:邮件服务器25端口不通 编辑:程序博客网 时间:2024/05/19 19:31
// Experiment 3.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<iostream>#include<fstream>using namespace::std;#define N 50#define Max 10000int matrix[N][N];int n;void ShowPath(int p[N], int i, int a) {if (i != a){if (p[i] != a&&p[i] != 99){ShowPath(p, p[i], a);cout << p[i] << "-->";}}}void Show2(int dis[],int a,int path[]) {for (int i = 0; i < n; i++){if (i != a&&dis[i] != 0 && dis[i] != Max) {cout << a << "-->";ShowPath(path, i, a);cout << i << "        " << dis[i] << endl;}else if(i!=a)cout << a << "-->" << i << "         " << "NULL" << endl;}}void Min(int a) {int dis[N] = { 0 };int newId=a;int newdis=0;int mark[N] = { 0 };int k;int path[N];for (int l = 0; l < N; l++){path[l] = 99;}for (int i = 0; i < n; i++){dis[i] = matrix[a][i];}mark[a] = 1;for (int i = 0; i < n-1 ; i++){k = 0;newdis = Max;for (int j = 0; j < n; j++){if (mark[j] != 1 && dis[j] != 0){if (newdis > dis[j]){newdis = dis[j];newId = j;}}}if (newdis != Max) {dis[newId] = newdis;mark[newId] = 1;}if (i == 0){path[newId] = a;}int temp;for (; k < n; k++){temp = dis[k];if (mark[k]!= 1&&matrix[newId][k]!=0){if (dis[k] != 0){dis[k] = dis[k] < (dis[newId] + matrix[newId][k]) ? dis[k] : (dis[newId] + matrix[newId][k]);}else{dis[k] = dis[newId] + matrix[newId][k];}if (dis[k] != temp){path[k] = newId;}}}}Show2(dis,a,path);}int main(){ifstream in;in.open("C:\\Users\\asus\\Documents\\Visual Studio 2017\\Projects\\Experiment 3\\input.txt");if (in.fail()){cout << "ERROR!";}in >> n;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){in>>matrix[i][j] ;}}int a;cout << "Input start point:" << endl;cin >> a;while (a<n&&a>=0){Min(a);cout << "Input start point:" << endl;cin >> a;}    return 0;}