中国运筹学会
? 游客: 注册 | 登录 | 会员 | 帮助 返回 中国运筹学会
中国运筹学会 ? 运筹算法与软件 ? Dijistra最短路径 二维数组结构 c++ (n^2)zz
作者: 标题: Dijistra最短路径 二维数组结构 c++ (n^2)zz 上一主题 | 下一主题
Aciclovir
Administrator
积分 4747
发贴 532
注册 2004-1-9
状态 离线 Dijistra最短路径 二维数组结构 c++ (n^2)zz
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream fin("Dijistra.in");
#define NN 1000 // Dijistra求有向图(map[n][n])中点s到其于顶点
的最短路。
// 数组d[n]存储最终结果。 flag[n]是标志数组。
int n,m,s; // n为顶点数,m为边数,s为起点。
int map[NN][NN],flag[NN],d[NN]; // 一律以0为起始单元。
void dijistra(int s);
int getmin();
void in();
int main()
{
in();
dijistra(s);
getchar();
fin.close();
return 0;
}
void dijistra(int s)
{
int i,j,k;
memset(flag,0,sizeof(flag));
memset(d,0,sizeof(d));
for (i=0;i<n;i++)
if (map[s]!=0) d=map[s];
d[s]=0;
flag[s]=1;
for (;;){
k=getmin();
flag[k]=1;
if (k==-1) break;
for (i=0;i<n;i++)
if (map[k] && (d==0 || d>d[k]+map[k])) d=d[k]+map[k][i
];
}
//out
cout<<"s= "<<s<<endl;
for (i=0;i<n;i++)
cout<<"d [ "<<i<<" ]= "<<d<<endl;
return;
}
int getmin()
{
int i,rec=-1;
for (i=0;i<n;i++)
if (!flag)
if (d!=0)
if (rec==-1) rec=i;
else
if (d[rec]>d) rec=i;
return rec;
}
void in()
{
int i,x,y,dist;
fin>>n>>m;
memset(map,0,sizeof(map));
for (i=0;i<m;i++){
fin>>x>>y>>dist;
map[x][y]=dist;
}
fin>>s;
return;
}
--
2004-4-20 18:46
可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题
论坛跳转: 日常事务 > 中国运筹学会公告板 学术天地 > 运筹算法与软件 > 学术会议发布 > 新书推荐 > 书评天地 > 不确定理论&不确定规划 不确定系统分会
> 加盟不确定系统分会 > 不确定系统分会会员录 > 学术讲座 > 学术沙龙 > 讲习班 友情链接 > UTLab (清华大学不确定理论实验室) > UTLab
Seminar
< 联系我们 - 中国运筹学会 >
Powered by Discuz! 2.0 COML ? 2002, Crossday, Bokavan Corp.
Processed in 0.074026 second(s), 6 queries