fscanf %*s 试了下没问题但仍报错,附tsp问题代码求大神指点

网安智编 厦门萤点网络科技 2025-10-13 00:05 65 0
试了一下,是没问题的,但是还是报错,不知道您了不了解tsp问题,我把代码附上,结果就是跑不出来,距离矩阵本来是0 2 7 2 52 0 3 5 17 3 0 4 62 5 4 0 35 1 6 3 0但是出现了中断,所以就把它改为65535...

试了一下,是没问题的,但是还是报错,不知道您了不了解tsp问题,我把代码附上,结果就是跑不出来,距离矩阵本来是0 2 7 2 52 0 3 5 17 3 0 4 62 5 4 0 35 1 6 3 0但是出现了中断,所以就把它改为65535 2 7 2 52 65535 3 5 17 3 65535 4 62 5 4 65535 35 1 6 3 65535改成这个的目的是为了让每个城市不经过自身源代码附上,望大神指点:#".h"#### tf* cnode; tf { int ;//当前的节点 int set; //当前的状态集合,用二进制表示 int ;//当前的路径值 cnode last;//记录上一个节点,以保存上一个的信息 cnode next;//记录下一个节点}; tsp{ int count;//当前的城市的个数 cnode* ltf;//记录 tf数组};void (int *a, int n){ int i; for (i = 0; i < n; i++) ("%d ", a

); ("\n");}void (int **a, int n){ int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { ("%d ", a

); } ("\n"); }}//自定义的幂函数int mypow(int x, int y){ (int)pow(()x, ()y);}//判断元素i是否在set集合中int inSet(int set, int i){ if ((set&mypow(2, i - 1)) > 0) 1; else 0;}//将元素i插入集合set中void (int &set, int i){ int p = mypow(2, i - 1); set = set | p;}//删除set中的ivoid (int &set, int i){ set = ~(mypow(2, i - 1))&set;}//读权矩阵int** (int &n, char* ){ FILE *fp; err; if ((err = (&fp, , "r")) != 0) { ("文件%s打开时出错\n", ); exit(1); } int i, j, **w; (fp, "%d", &n); w = (int**)(n, (int*)); for (i = 0; i < n; i++) { w

= (int*)(n, (int)); } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { (fp, "%d", &w

); } } (fp); w;}//返回组合数C(n,r)值int (int n, int r){ int i, c, k, *a; a = (int*)(n, (int)); for (i = 0; i < n; i++) { a

= i + 1; } c = 0; do { i = -1; for (k = 0; k < r; k++) if (a

< n - r + k + 1)i = k; if (i != -1) { a

++; for (k = i + 1; k < r; k++)a

= a

k - 1

+ 1;c++; } } while (i != -1); free(a); c + 1;}//指定组合c(n,r)中所有可能组合,返回其转化后的01格式的int数组int* (int *a0, int n, int r, int sn){ int i, c, k, *set, *a; c = 0; set = (int*)(sn, (int)); for (i = 0; i < sn; i++) { set

= 0; } a = (int*)(n, (int)); for (i = 0; i < n; i++) { a

= i + 1; } int t; for (i = 0; i < r; i++) { t = a

- 1; (set

, a0

); } do { i = -1; for (k = 0; k < r; k++) if (a

< n - r + k + 1)i = k; if (i != -1) { a

++; for (k = i + 1; k < r; k++)a

= a

k - 1

+ 1;c++; for (k = 0; k < r; k++) {t = a

- 1;(set

, a0

); } } } while (i != -1); free(a); set;}//设置最后一个集合int (int n){ int i, set; set = 0; for (i = 0; i < n; i++) { set = set | mypow(2, i); } set;}//获得第row行的set中所有元素集合 ,总元素的个数为nint* (int set, int row, int n){ int i, j, *a; a = (int*)(row, (int)); j = 0; for (i = 1; i < n; i++) { if (inSet(set, i) == 1) { a

= i; j++; } if (j == row) { break; } } a;}//将集合a转为二进制的数int (int *a, int n){ int set, i, t; set = 0; for (i = 0; i < n; i++) { t = a

- 1; set = set | mypow(2, t); } set;}//将set

中的第i个点删除int* (int*set, int i, int n){ int * s, j, k; s = (int*)(n - 1, (int)); k = 0; for (j = 0; j < n; j++) { if (j != i) { s

= set

; k++; } } s;}//查找上一节点cnode (int row, cnode p, tsp ){ cnode phead; phead = (cnode)((*phead));//必须分配空间 phead = .ltf

row

; cnode q; q = (cnode)((*q)); q = phead; while (phead != NULL) { q = phead; if ((q-> == p->) && (p->set == q->set)) { break; } phead = phead->next; } q;}//设置上一节点void (cnode p, int row, tsp , int **w){ int start = p->; cnode* clast; int i, n; n = .count; int *; //将节点p中的set转为相应的int型数组 = (p->set, row, n); clast = (cnode*)(row, (cnode)); //设置所有关联的上一级的接点 for (i = 0; i < row; i++) { int *dSet = (, i, row); int sDNum; if (row == 1) { sDNum = 0; } else { sDNum = (dSet, row - 1); } clast

= (cnode)((*clast

旅行商问题C语言求解_tsp问题代码实现_fscanf %*s

));//必须有的语句 clast

-> =

; clast

->last = NULL; clast

->next = NULL; clast

->set = sDNum; clast

= (row - 1, clast

, );//之后测试这个函数 } int , ; cnode q; q = clast

; = w

start

q->

+ q->; = 0; for (i = 1; i < row; i++) { q = clast

; int len = w

start

q->

+ q->; if ( > len) { = len; = i; } } p->last = clast

; p-> = ;}//设置集合,即已知起点,列举所有可能状态集合int* (int row, int start, int n, int &sn){ int *set, i, j, *a; sn = (n - 2, row); //集合a中存放V中所用可能取得的点的下标 a = (int*)(n - 2, (int)); i = 0; for (j = 1; j < n; j++) { if (j != start) { a

= j; i++; } } set = (a, n - 2, row, sn); free(a); set;}void tsp(char *){ int **w, n; //从文件中读取路径权值矩阵信息 w = (n, ); //数据结构:使用的是链接结构 //每一层对应一行,每一层中所有的节点依次排列 tsp ; .count = n; .ltf = (cnode*)(n - 1, (cnode)); int i, j; for (i = 0; i < n - 1; i++) { .ltf

= NULL; } cnode p, q; q = (cnode)((*q)); //添加第一行 for (i = 1; i < n; i++) { p = (cnode)((*p)); p-> = i; p->last = NULL; p->next = NULL; p-> = w

; p->set = 0; if (.ltf

== NULL) { .ltf

= p; } else { q->next = p; } q = p; } int *sSet, sn, ts; //添加其余几行 for (i = 1; i < n - 1; i++) { for (j = 1; j < n; j++) { sSet = (i, j, n, sn); for (ts = 0; ts < sn; ts++) {p = (cnode)((*p));p-> = j;p->set = sSet

ts

;(p, i, , w);//是i不是jif (.ltf

== NULL){.ltf

= p;}elseq->next = p;q = p; free(sSet); } } } //求解最后的f0(v0,{v1,v2,...vn-1}); cnode last; last = (cnode)((*last)); last-> = 0; last->set = (n - 1); (last, n - 1, , w); int *path; path = (int*)(n, (int)); i = 0; p = last; while (p != NULL) { cnode p1 = p; path

= p-> + 1; i++; p = p->last; } ("最短路的路径为: "); for (i = 0; i < n; i++) { ("%d -> ", path

); } ("%d \n", 1); ("最短路径的长度为:%d\n", last->);}void main(){ tsp("da.txt"); ("pause");}