单源最短路径
来源:互联网 发布:网络兼职干什么好 编辑:程序博客网 时间:2024/06/05 09:26
#include<stdio.h>
#include<iostream>
using namespace std;
#define maxint 1000
typedef int* pointer;
void Dijkstra(int n,int v,int *dist,int *prev,int **c){
bool *s = new bool[n+1];//顶点i是否属于集合s
for(int i = 1;i <= n;i++){//初始化部分
dist[i] = c[v][i];
s[i] = false;
if(dist[i] == maxint)
prev[i] = 0;//源点到顶点i没有直接的路
else
prev[i] = v;//源点到顶点i有直接的路
}
dist[v] = 0;//对源点的设置
s[v] = true;
for(i = 1;i < n;i++)
{
int temp = maxint;
int u = v;
for(int j = 1;j <= n;j++)
if((!s[j]) && (dist[j] < temp)){
u = j;
temp = dist[j];
}
s[u] = true;
for(j = 1;j <= n;j++)
if((!s[j]) && (c[u][j] < maxint)){
int newdist = dist[u] + c[u][j];
if(newdist < dist[j]){
dist[j] = newdist;
prev[j] = u;
}
}
}
delete s;
}
// 查找从源点v到终点u的路径,并输出
void Path(int *prev,int v,int u)//u是当前顶点
{
if(u == v){
return;
}
Path(prev,v,prev[u]);
printf("%d,",prev[u]);
}
int fileRead(char *filePath,int ** &rArray){
if(!filePath){
rArray = NULL;
printf("Cannot open file !");
return 0;
}
FILE * fp = fopen(filePath,"r");
if( fp == NULL){
printf("ERROR:File not exist\n");
exit(-1);
}
int arrayNum = 0;
fscanf(fp, "%d\n", &arrayNum);
rArray = new pointer[arrayNum+1];
if( arrayNum > 0 ){
for (int i = 0;i < arrayNum+1;i++ ) {
rArray[i] = new int[arrayNum + 1];
}
for (int j = 1; j <= arrayNum;j++ ) {
for (int x = 1; x <= arrayNum; x++ ) {
if ( x == arrayNum ) {/* 假如读到每行最后一个数字 */
fscanf(fp, "%d\n", &(rArray[j][x]));
}else
fscanf(fp, "%d ", &(rArray[j][x]));
}
}
}
fclose(fp);
return arrayNum;
}
void main()
{
int **c = 0;
int v;//源点
int n = fileRead("jxx.txt",c);
int *prev = new int[n + 1];
int *dist = new int[n + 1];
printf("输入源点:");
scanf("%d",&v);
Dijkstra(n,v,dist,prev,c);
for(int i = n;i > 0;i--){
printf("顶点%d到顶点%d的路径为:",v,i);
Path(prev,v,i);
printf("%d长度为%d\n",i,dist[i]);
}
delete prev;
delete dist;
delete []c;
}
#include<iostream>
using namespace std;
#define maxint 1000
typedef int* pointer;
void Dijkstra(int n,int v,int *dist,int *prev,int **c){
bool *s = new bool[n+1];//顶点i是否属于集合s
for(int i = 1;i <= n;i++){//初始化部分
dist[i] = c[v][i];
s[i] = false;
if(dist[i] == maxint)
prev[i] = 0;//源点到顶点i没有直接的路
else
prev[i] = v;//源点到顶点i有直接的路
}
dist[v] = 0;//对源点的设置
s[v] = true;
for(i = 1;i < n;i++)
{
int temp = maxint;
int u = v;
for(int j = 1;j <= n;j++)
if((!s[j]) && (dist[j] < temp)){
u = j;
temp = dist[j];
}
s[u] = true;
for(j = 1;j <= n;j++)
if((!s[j]) && (c[u][j] < maxint)){
int newdist = dist[u] + c[u][j];
if(newdist < dist[j]){
dist[j] = newdist;
prev[j] = u;
}
}
}
delete s;
}
// 查找从源点v到终点u的路径,并输出
void Path(int *prev,int v,int u)//u是当前顶点
{
if(u == v){
return;
}
Path(prev,v,prev[u]);
printf("%d,",prev[u]);
}
int fileRead(char *filePath,int ** &rArray){
if(!filePath){
rArray = NULL;
printf("Cannot open file !");
return 0;
}
FILE * fp = fopen(filePath,"r");
if( fp == NULL){
printf("ERROR:File not exist\n");
exit(-1);
}
int arrayNum = 0;
fscanf(fp, "%d\n", &arrayNum);
rArray = new pointer[arrayNum+1];
if( arrayNum > 0 ){
for (int i = 0;i < arrayNum+1;i++ ) {
rArray[i] = new int[arrayNum + 1];
}
for (int j = 1; j <= arrayNum;j++ ) {
for (int x = 1; x <= arrayNum; x++ ) {
if ( x == arrayNum ) {/* 假如读到每行最后一个数字 */
fscanf(fp, "%d\n", &(rArray[j][x]));
}else
fscanf(fp, "%d ", &(rArray[j][x]));
}
}
}
fclose(fp);
return arrayNum;
}
void main()
{
int **c = 0;
int v;//源点
int n = fileRead("jxx.txt",c);
int *prev = new int[n + 1];
int *dist = new int[n + 1];
printf("输入源点:");
scanf("%d",&v);
Dijkstra(n,v,dist,prev,c);
for(int i = n;i > 0;i--){
printf("顶点%d到顶点%d的路径为:",v,i);
Path(prev,v,i);
printf("%d长度为%d\n",i,dist[i]);
}
delete prev;
delete dist;
delete []c;
}
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 单源最短路径
- 使用CCproxy软件---为什么出现SOCKS/HTTP/FTP/邮件/新闻等代理启动失败
- 棋盘问题
- 这些东西我们一直在寻找
- gridview 清空
- JDK1.5的新特性
- 单源最短路径
- contentSize、contentInset和contentOffset区别
- android 2.3源码 下载与编译 以前我让我小弟写的,今天看到就转了
- 【Django tutorial1】
- 流水作业调度
- plsql学习范例--使用utl_file包将查询结果输出到文件中
- 哈夫曼编码
- 嵌入式Linux系统下I2C设备驱动程序的开发
- 0-1背包 动态规划