图的应用(邻接表,最短路径,最小生成树)(用C语言写)

QiningCHEN 2010-06-06 09:27:07
综合性、设计性实验
图的应用(用C语言写)

该实验要求学生以城市交通网络为背景,设计出一个简单的能够实现城市交通网络信息查询功能的系统。通过该题目的设计过程,可以加深理解线性表、树、图的基本概念、逻辑结构及存储结构,掌握无向图的重要应用——最短路径的算法,广度优先搜索方法的应用,构造最小生成树的算法。

城市间的交通网络采用邻接表表示,要求能:
(1) 显示邻接表
(2) 显示城市间最短路径
(3) 显示得到的最小生成树中包括了哪些城市,并显示得到的最小生成树的代价.

主要内容及实现的功能
(1) 用Dijkstra方法求最短路径;
(2) 实现广度优先或深度优先算法实现遍历;
(3) 用Prim算法建立最小生成树,并计算得到的最小生成树的代价.
...全文
1027 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyfdgh 2010-11-30
  • 打赏
  • 举报
回复
dique
wshn13 2010-10-08
  • 打赏
  • 举报
回复
这个还是比较难的哈哈
jvs 2010-10-05
  • 打赏
  • 举报
回复
这个作业是有点大,而且难调
djjlove_2008 2010-06-08
  • 打赏
  • 举报
回复

#include<iostream>
#include<fstream>
#define N 100
using namespace std;
int n;//结点数
int a[N][N] = {0};
bool judgeNode(int flagNodes[N]){//判断是否还有未访问结点
for(int i = 0; i < n; i++)
if(flagNodes[i] == 0) return 1;
return 0;
}

void judgeSub(int flagSub[N], int x, int y){//标记分支
if(flagSub[x] != 0){
if(flagSub[y] == 0) flagSub[y] = flagSub[x];
else{
int min = flagSub[x] < flagSub[y] ? flagSub[x] : flagSub[y];
int max = flagSub[x] + flagSub[y] - min;
for(int i = 0; i < n; i++)
if(flagSub[i] == max)
flagSub[i] = min;
}
}
else{
if(flagSub[y] == 0){
int max = 0;
for(int i = 0; i < n; i++){
if(flagSub[i] != 0 && flagSub[i] > max)
max = flagSub[i];
}
flagSub[x] = flagSub[y] = ++max;
}
else flagSub[x] = flagSub[y];
}
}

bool judgeCircle(int flagSub[N], int x, int y){//判断生成树中无圈
if(flagSub[x] == 0 && flagSub[y] == 0) return 1;
if(flagSub[x] != flagSub[y]) return 1;
return 0;
}

void kruskal(){
int temp[N][N] = {0};
int flagNodes[N] = {0};
int flagSub[N] = {0};
int least = N;
int x = 0, y = 0;
cout<<"The edges of Optimal tree:"<<endl;
while(judgeNode(flagNodes)){
least = N;
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
if(a[i][j] && a[i][j] < least && //关键的判断条件
judgeCircle(flagSub, i, j) && temp[i][j]==0){
least = a[i][j];
x = i, y = j;
}
}
}
cout<<"("<<x<<","<<y<<")-";//输出选取人权值最小的边
if(least < N){
flagNodes[x] = 1;
flagNodes[y] = 1;
judgeSub(flagSub, x, y);
temp[x][y] = 1, temp[y][x] = 1;
}
}
cout<<endl;
//onput optimal tree
cout<<"Optimal Tree in the Matrix:"<<endl;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++)
cout<<temp[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}

int main(){
ifstream in("kruskal.txt");
int nodes,entry;
while(in>>n){
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
in>>a[i][j];
kruskal();//Kruskal函数
}
return 0;
}
用kruskal比prime好些,我个人感觉。
Initiala 2010-06-08
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
Initiala 2010-06-08
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
z569362161 2010-06-06
  • 打赏
  • 举报
回复
太大的程序怕没人写啊!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧