网友您好, 请在下方输入框内输入要搜索的题目:

题目内容 (请给出正确答案)

阅读下列函数说明和C代码,

[说明]

所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路,使回路经过图中的每一个点,而且回路各边的权之和最小。

应用贪婪法求解该问题,程序先计算由各点构成的所有边的长度(作为边的权值),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。

函数中使用的预定义符号如下:

define M 100

typedef struct{/*x为两端点p1、p2之间的距离,p1、p2所组成边的长度*/

float x;

int p1,p2;

}tdr;

typedef struct{/*p1、p2为和端点相联系的两个端点,n为端点的度*/

int n,p1,p2;

}tr;

typedef struct{/*给出两点坐标*/

float x,y;

}tpd;

typedef int tl[M];

int n=10;

[函数]

float distance(tpd a,tpd b);/*计算端点a、b之间的距离*/

void sortArr(tdr a[M],int m);

/*将已经计算好的距离关系表按距离大小从小到大排序形成排序表,m为边的条数*/

int isCircuit(tr r[M],int i,int j);

/*判断边(i,j)选入端点关系表r[M]后,是否形成回路,若形成回路返回0*/

void selected(tr r[M],int i,int j);/*边(i,j)选入端点关系表r*/

void course(tr r [M],tl l[M]);/*从端点关系表r中得出回路轨迹表*/

void exchange(tdr a[M],int m,int b);

/*调整表排序表,b表示是否可调,即是否有长度相同的边存在*/

void travling(tpd pd [M],int n,float dist,tl locus[M])

/*dist记录总路程*/

{

tdr dr[M];/*距离关系表*/

tr r[M];/*端点关系表*/

int i,j,k,h,m;/*h表示选入端点关系表中的边数*/

int b;/*标识是否有长度相等的边*/

k=0;

/*计算距离关系表中各边的长度*/

for(i=1;i<n; i++){

for(j=i+1;J<=n;j++){

k++;

dr[k].x=(1);

dr[k].pl=i;

dr[k].p2=j;

}

}

m=k;

sortArr(dr,m);/*按距离大小从小到大排序形成排序表*/

do{

b=1;

dist=0;

k=h=0:

do{

k++;

i=dr[k].p1;

j=dr[k].p2;

if((r(i].n<=1)&&(r[j].n<=1)){/*度数不能大于2*/

if (2) {

/*若边(i,j)加入r后形成回路,则不能加入*/

(3);

h++;

dist+=dr[k].x;

}else if (4) {

/*最后一边选入r成回路,则该边必须加入且得到解*/

selected(r,i,j);

h++:

dist+=dr[k].x;

}

}

}while((k !=n) && (h !=n));

if(h==n){/*最后一边选入构成回路,完成输出结果*/

course(r,locus);

}else(/*找不到解,调整dr,交换表中边长相同的边在表中的顺序,并将b置0*/

(5);

}

}while(!b);

}

(1)


参考答案

更多 “ 阅读下列函数说明和C代码,[说明]所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路,使回路经过图中的每一个点,而且回路各边的权之和最小。应用贪婪法求解该问题,程序先计算由各点构成的所有边的长度(作为边的权值),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。函数中使用的预定义符号如下:define M 100typedef struct{/*x为两端点p1、p2之间的距离,p1、p2所组成边的长度*/float x;int p1,p2;}tdr;typedef struct{/*p1、p2为和端点相联系的两个端点,n为端点的度*/int n,p1,p2;}tr;typedef struct{/*给出两点坐标*/float x,y;}tpd;typedef int tl[M];int n=10;[函数]float distance(tpd a,tpd b);/*计算端点a、b之间的距离*/void sortArr(tdr a[M],int m);/*将已经计算好的距离关系表按距离大小从小到大排序形成排序表,m为边的条数*/int isCircuit(tr r[M],int i,int j);/*判断边(i,j)选入端点关系表r[M]后,是否形成回路,若形成回路返回0*/void selected(tr r[M],int i,int j);/*边(i,j)选入端点关系表r*/void course(tr r [M],tl l[M]);/*从端点关系表r中得出回路轨迹表*/void exchange(tdr a[M],int m,int b);/*调整表排序表,b表示是否可调,即是否有长度相同的边存在*/void travling(tpd pd [M],int n,float dist,tl locus[M])/*dist记录总路程*/{tdr dr[M];/*距离关系表*/tr r[M];/*端点关系表*/int i,j,k,h,m;/*h表示选入端点关系表中的边数*/int b;/*标识是否有长度相等的边*/k=0;/*计算距离关系表中各边的长度*/for(i=1;i<n; i++){for(j=i+1;J<=n;j++){k++;dr[k].x=(1);dr[k].pl=i;dr[k].p2=j;}}m=k;sortArr(dr,m);/*按距离大小从小到大排序形成排序表*/do{b=1;dist=0;k=h=0:do{k++;i=dr[k].p1;j=dr[k].p2;if((r(i].n<=1)(r[j].n<=1)){/*度数不能大于2*/if (2) {/*若边(i,j)加入r后形成回路,则不能加入*/(3);h++;dist+=dr[k].x;}else if (4) {/*最后一边选入r成回路,则该边必须加入且得到解*/selected(r,i,j);h++:dist+=dr[k].x;}}}while((k !=n) (h !=n));if(h==n){/*最后一边选入构成回路,完成输出结果*/course(r,locus);}else(/*找不到解,调整dr,交换表中边长相同的边在表中的顺序,并将b置0*/(5);}}while(!b);}(1) ” 相关考题
考题 如下所示是一个带权连通无向图,其最小生成树各边权的总和为A. 24B.25C.26D.27

考题 阅读以下说明和关系表,回答问题1~3。[说明]已知关系R(A,B,C,D) 和函数依赖集F为{AB—>D,C—>,A,D—>C}。找出关系R的候选键,一共有几个?

考题 阅读下列函数说明和c代码,将应填入(n)处的字句写在对应栏内。【说明】所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路,使回路经过图中的每一个点,而且回路各边的权之和最小。应用贪婪法求解该问题。程序先计算由各点构成的所有边的长度(作为边的权值),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择边组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。函数中使用的预定义符号如下:define M 100typedef struct{/*x为两端点p1、p2之间的距离,p1、p2所组成边的长度*/float x;int p1, p2;}tdr;typedef struct{/*p1、p2为和端点相联系的两个端点,n为端点的度*/int n, P1, p2;}tr;typedef struct{/*给出两点坐标*/float x,y;}tpd;typedef int tl[M];int n=10;【函数】float distance(tpd a,tpd b);/*计算端点a、b之间的距离*/void sortArr(tdr a[M], int m);/*将已经计算好的距离关系表按距离大小从小到大排序形成排序表,m为边的条数*/int isCircuit(tr[M], int i, int j);/*判断边(i, j)选入端点关系表r[M]后,是否形成回路,若形成回路返回0*/void selected(tr r[M], int i, int j);/*边(i,j)选入端点关系表r*/void course(tr r[M], tl 1[M]);/*从端点关系表r中得出回路轨迹表*/void exchange(tdr a[M], int m, int b);/*调整表排序表,b表示是否可调,即是否有边长度相同的边存在*/void travling(tpd pd[M], int n, float dist, t1 locus[M])/*dist记录总路程*/{tdr dr[M];/*距离关系表*/tr r[M];;/*端点关系表*/int i, j, k, h, m;/*h表示选入端点关系表中的边数*/int b;/*标识是否有长度相等的边*/k=0;/*计算距离关系表中各边的长度*/for(i=1;i<n;i++){for(j=i+1;j<=n;j++){k++;dr[k].x=(1);dr[k].p1=i;dr[k].p2=j;}}m=k;sortArr(dr,m);/*按距离大小从小到大排序形成排序表*/do{b=1;dist=0;k=h=0;do{k++;i=dr[k].p1;j=dr[k].p2;if((r[i].n<=1)(r[j].n<=1)){/*度数不能大于2*/if((2)){/*若边(i,j)加入r后形成回路,则不能加入*/(3);h++;dist+=dr[k].x;}else if((4)){/*最后一边选入r成回路,则该边必须加入且得到解*/selected(r,i,j);h++;&n

考题 阅读下列说明和代码,回答问题1和问题2,将解答写在答题纸的对应栏内。 ?【说明】 ?某本地口令验证函数(C语言环境,X86 32指令集)包含如下关键代码;某用户的口令保存在字符数组origPassword中,用户输入的口令保存在字符数 组userPassword中,如果两个数组中的内容相同则允许进入系统。 【问题1】(4分) 用户在调用gets()函数时输入什么样式的字符串,可以在不知道的原始口令“Secret”的情况下绕过该口令验证函数的限制? 【问题2】(4分) 上述代码存在什么类型的安全隐患?请给出消除该安全隐患的思路

考题 无向图的每条边变为方向相反的两条边,容量是原边的容量,这样无向图的最大流问题变换为有向图的最大流问题。

考题 给定带权无向图,如果图中各边权值互不相同,用普里姆和克鲁斯卡尔算法得到的最小代价生成树一定相同

考题 32、给定带权无向图,如果图中各边权值互不相同,用普里姆和克鲁斯卡尔算法得到的最小代价生成树一定相同

考题 Dijkstra算法要求有向图的边的权是非负实数. 请举出反例说明,对于某些含有负数边权的有向图,Dijkstra算法不能得到正确的解.

考题 10、在“最短运输路线问题”中,建立图的模型包括了以下哪些要素:A.顶点;B.有向边、无向边;C.边权;D.将原问题转化为图论问题

考题 16、在下列有关无向图的论述中,哪一个是不正确的?A.对于给定的无向图,若两个点之间有多于一条的边,则称这些边为多重边;B.对于给定的无向图,任一条边的两个端点都不相同;C.对于给定的无向图,一个无环、无多重边的图称为简单图;D.对于给定的无向图,一个无环但允许有多重边的图称为多重图。