中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx

上传人:b****2 文档编号:2203790 上传时间:2022-10-27 格式:DOCX 页数:16 大小:99.41KB
下载 相关 举报
中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx_第1页
第1页 / 共16页
中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx_第2页
第2页 / 共16页
中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx_第3页
第3页 / 共16页
中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx_第4页
第4页 / 共16页
中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx

《中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx》由会员分享,可在线阅读,更多相关《中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx(16页珍藏版)》请在冰豆网上搜索。

中兴捧月程序设计大赛求网络中两点之间的路径程序cpath.docx

中兴捧月程序设计大赛求网络中两点之间的路径程序cpath

求网络中两点之间的路径

(申明:

本文全部原创,谢谢配合,多谢支持)

(作者:

ngspace)

(日期:

2013_09_03)

一、题目

在一个网络拓扑中(可以支持数千个点的规模),边是双向的,两点之间最多有一条边,所有边的距离相等(也就是权重为1),给出源和目的两个点,需要找出满足条件的路径。

1。

找出源和目的之间的一条主用路径。

2。

找出源和目的之间的一条备用路径。

备用路径和主用路径至少有一个点或边不相同。

 关于备用路径可能满足下列约束:

 1)和主用路径没有相同的中间节点。

 2)和主用路径没有相同的边。

例如:

示例数据

A_NE_ID,Z_NE_ID

2,28

4,48

9,45

10,1

10,11

11,12

11,2

12,13

13,14

15,23

16,24

17,25

18,19

18,1

20,21

20,29

20,3

21,22

22,23

23,24

24,32

26,27

26,34

27,28

27,35

28,36

29,37

30,31

32,40

32,33

32,31

33,25

33,41

36,44

37,38

37,45

39,30

39,4

40,5

40,49

43,42

43,50

43,6

44,43

45,7

45,8

46,37

46,47

47,48

48,40

拓扑图描述文件

拓扑图文件说明,出于简化的目的,网络拓扑节点用数字表示。

附一个节点较多的测试数据,该数据在在节点631到节点1980之间找路。

二、初赛阶段要求(含编程语言、开发及运行环境的要求)

1.编程语言:

C/C++或者JAVA

2.运行环境:

WindowsXP

3.源代码和算法说明

4.若采用c/c++,要输出可执行程序;若采用java,给出jar和bat。

5.程序支持命令行参数,

/f后表示拓扑图文件

/s 表示源节点

/d表示目的节点

/c 表示条件(取值1-2,满足上面两个约束条件之一)

/o 表示输出结果文件

如cpath.exe /ftopolink_example01.txt /s20 /d32 /c2/otopolink_result01.txt

表示根据拓扑图文件topolink_example01.txt,计算节点20和节点32之间的主用和备用路径,备用路径要求满足约束条件2。

输出结果文件topolink_result01.txt内容可能的为

main:

 20,21,22,23,24,32

backup:

20,29,37,46,47,48,40,32

三、初赛阶段审核标准及评价细则

测试结果80分,10组随机网络数据,网络规模:

网元结点数目100到5000不等。

在10分钟内完成计算并正确输出结果的,每计算正确一组数据加8分(主备各4分), 路径较短优,耗时较短优。

代码满分5分,可读性及注释。

文档满分15分,要求给出设计思想。

四、设计思想

针对该问题,可将网络中每个点看成一个节点,从而采用图来存储数据。

在程序中具体采用的是图的链接表进行存储。

寻找主用路径和备用路径采用回溯法求出多条路径,并从中选出满足条件的路径,之后将输出结果写入文件中。

程序设计主要包括命令处理模块,数据读取模块(含链接表建立),求解路径模块(含输出写入文件)三大模块。

命令处理模块中将会检测输入命令及其参数是否满足正确。

如果输入正确则从中提取相关参数以供后面进行求解使用。

如果输入命令不满足要求则给出错误提示并给出正确的命令格式样式。

数据读取模块实现从指定文件(文件名又命令处理模块提取的参数提供)读取节点数据及各条边,并将其存入链接表中。

求解路径模块根据命令中输入的源节点和目标节点在图中寻找满足要求的主用路径和备用路径。

本模块采用的回溯法求解路径,并进行判断是否满足条件。

如果满足则停止计算并将数据写入文件,若不满足则继续求解直至满足条件为止。

具体的程序设计及个模块的实现请看代码。

五、我的代码

#include

#include

#include

 

#defineNULL0

 

structedgenode

{

intedgeno;

structedgenode*next;

};//定义顶点节点结构

typedefstructvex

{

structedgenode*first;

}vex;//用于存放各顶点节点对应的第一个链指针

 

intcmderror(void);

intinitcmd(intargc,char*argv[]);

voidreadfile(charfilename[]);

intgetpath(intst,inten,intcond);

voidwriteno(intno,FILE*fp);

 

vex*g;

structedgenode*p,*q;

charrfile[16],wfile[16];

intn,e;//*n是结点个数,e是边的个数*//

intsour,des,cond;

 

intmain(intargc,char*argv[])

{

//初始化输入命令,提取参数

initcmd(argc,argv);//注意:

此处argv后不需要括号

//读入数据

readfile(rfile);

//计算路径并写入文件

getpath(sour,des,cond);

return0;

}

/*********************************************************************\

功能:

输入命令行不满足要求给出的提示

\*********************************************************************/

intcmderror(void)

{

printf("*******************************************************************************\n");

printf("请按下列格式输入命令:

\n");

printf("cpath.exe/f***/s***/d***/c***/o***\n");

printf("说明:

\n");

printf("

(1)/f后表示拓扑图文件;\n");

printf("

(2)/s后表示源节点;\n");

printf("(3)/d后表示目的节点;\n");

printf("(4)/c后表示条件(取值1-2,满足上面两个约束条件之一);\n");

printf("(5)/o后表示输出结果文件.\n");

printf("请重新输入!

\n");

printf("*******************************************************************************\n");

exit

(1);

}

/*********************************************************************\

功能:

初始化输入命令,提取参数

\*********************************************************************/

intinitcmd(intargc,char*argv[])

{

charpara[5][16],test[5]={'a','a','a','a','a'};

inti,tem,count,temdata[5];

if(argc!

=6)

cmderror();

printf("***********************************欢迎使用************************************\n");

for(i=1;i<6;i++)

{

if(argv[i][1]=='f'||argv[i][1]=='s'||argv[i][1]=='d'||argv[i][1]=='c'||argv[i][1]=='o')

{

count=0;

tem=0;

count=strlen(argv[i]);//求字符串的长度

switch(argv[i][1])

{

case'f':

for(tem=0;tem

rfile[tem]=argv[i][tem+2];

test[0]='f';

break;

case's':

sour=0;

for(tem=0;tem

temdata[tem]=argv[i][tem+2]-48;

for(tem=count-2;tem>0;tem--)

sour=sour+temdata[count-2-tem]*pow(10,tem-1);

test[1]='s';

break;

case'd':

des=0;

for(tem=0;tem

temdata[tem]=argv[i][tem+2]-48;

for(tem=count-2;tem>0;tem--)

des=des+temdata[count-2-tem]*pow(10,tem-1);

test[2]='d';

break;

case'c':

if(argv[i][2]=='1')

cond=1;

elseif(argv[i][2]=='1')

cond=2;

else

cmderror();

test[3]='c';

default:

for(tem=0;tem

wfile[tem]=argv[i][tem+2];

test[4]='o';

}

}

else

cmderror();

}

if(test[0]=='f'&test[1]=='s'&test[2]=='d'&test[3]=='c'&test[4]=='o')

return(0);

else

cmderror();

}

 

/*********************************************************************\

功能:

计算从节点st到节点en的路径,并将结果写入文件

参数:

st表示起点,en表示终点,cond表示所满足的条件编号

\*****************************************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1