目录

  • 函数题
    • 01-复杂度3 二分查找
    • 02-线性结构2 在一个数组中实现两个堆栈
    • 03-二叉树1 二叉树的遍历
    • 05-散列1 线性探测法的查找函数
    • 06-图1 邻接矩阵存储图的深度优先遍历
  • 编程题
    • 01-复杂度1 最大子列和问题
    • 02-线性结构1 一元多项式的乘法与加法运算
    • 02-线性结构3 列车调度
    • 03-树1 树的同构
    • 04-二叉搜索树1 是否同一棵二叉搜索树
    • 04-二叉平衡树1 Root of AVL Tree
    • 05-堆 堆中的路径
    • 05-哈夫曼编码 哈夫曼编码
    • 06-散列查找1 电话聊天狂人
    • 07-图的遍历 列出连通集
    • 08-最短路径 哈利·波特的考试(方法一 floyd)
    • 08-最短路径 哈利·波特的考试(方法二 dijkstra)
    • 09-最小生成树 公路村村通
    • 09-拓扑排序 任务调度的合理性

函数题

01-复杂度3 二分查找

Position BinarySearch(List L,ElementType X){int l=1,r=L->Last;while(l<=r){int mid = l+(r-l)/2;if(L->Data[mid] == X) return mid;else if(L->Data[mid]<X) l = mid+1;else r = mid;}return NotFound;
}

02-线性结构2 在一个数组中实现两个堆栈

Stack CreateStack(int MaxSize){ElementType* data = (ElementType*)malloc(sizeof(ElementType)*MaxSize);Stack S = (Stack)malloc(sizeof(struct SNode));S->Data = data;S->Top1 = -1;S->Top2= MaxSize;S->MaxSize = MaxSize;return S;
}
bool Push(Stack S,ElementType X,int Tag){if(S->Top2-S->Top1 == 1){printf("Stack Full\n");return false;}if (Tag == 1){S->Top1+=1;S->Data[S->Top1] = X;}else{S->Top2 -=1;S->Data[S->Top2] = X;}return true;
}
ElementType Pop(Stack S,int Tag){ElementType num;if(Tag == 1){if(S->Top1 == -1){printf("Stack 1 Empty\n");return ERROR;}num = S->Data[S->Top1];S->Top1--;}else{if(S->Top2 == S->MaxSize){printf("Stack 2 Empty\n");return ERROR;}num = S->Data[S->Top2];S->Top2++;}return num;
}

03-二叉树1 二叉树的遍历

void InorderTraversal(BinTree BT){if(BT == NULL) return;InorderTraversal(BT->Left);printf(" %c",BT->Data);InorderTraversal(BT->Right);
}
void PreorderTraversal(BinTree BT){if(BT == NULL) return;printf(" %c",BT->Data);PreorderTraversal(BT->Left);PreorderTraversal(BT->Right);
}
void PostorderTraversal(BinTree BT){if(BT == NULL) return;PostorderTraversal(BT->Left);PostorderTraversal(BT->Right);printf(" %c",BT->Data);
}
void LevelorderTraversal(BinTree BT){if(BT == NULL) return;BinTree queue[10000];ElementType head,tail;head = tail = 0;queue[tail++] = BT;while(head<tail){BinTree q = queue[head];printf(" %c",q->Data);if(q->Left != NULL) queue[tail++]=q->Left;if(q->Right != NULL) queue[tail++]=q->Right;head++;}
}

05-散列1 线性探测法的查找函数

Position Find(HashTable H, ElementType Key){Position index = Hash(Key,H->TableSize);int cnt = 0;while(cnt < H->TableSize){if(H->Cells[index].Info != Legitimate ||H->Cells[index].Data == Key)return index;index = (index+1)%H->TableSize;cnt++;}return ERROR;
}

06-图1 邻接矩阵存储图的深度优先遍历

void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ){Visit(V);Visited[V] = true;int i = 0;for(;i<Graph->Nv;++i){if(Visited[i]==false && Graph->G[V][i]!=INFINITY){DFS(Graph,i,Visit);}}return;
}

编程题

01-复杂度1 最大子列和问题

#include<stdio.h>
int main(){int n;scanf("%d",&n);int max_sum = 0,now_sum=0;int i = 0,num;for(;i<n;++i){scanf("%d",&num);now_sum += num;if(now_sum<0){now_sum=0;}max_sum = max_sum>now_sum?max_sum:now_sum;}printf("%d",max_sum);return 0;
}

02-线性结构1 一元多项式的乘法与加法运算

#include<stdio.h>
typedef struct Polynomial {int coef, exp;//coef是系数,exp是指数
} Poly;
/*崩纱卡拉卡*/
int mul_res[2024];
int add_res[2024];
void polyAdd(Poly a[], Poly b[], int n, int m) {int i;for (i = 0;i < n;++i)    add_res[a[i].exp] += a[i].coef;for (i = 0;i < m;++i)    add_res[b[i].exp] += b[i].coef;
}
void polyMulti(Poly a[], Poly b[], int n, int m) {int i, j;int coef, exp;for (i = 0;i < n;++i) {for (j = 0;j < m;++j) {coef = a[i].coef * b[j].coef;exp = a[i].exp + b[j].exp;mul_res[exp] += coef;}}
}
void output(int res[]) {int flag = 0;//判别是否出现0多项式int i;for (i = 2022;i >= 0;--i) {if (res[i] != 0) {if (flag == 1)    printf(" ");//除了第一次的输出,其余的都要先加空格printf("%d %d", res[i], i);flag = 1;}}if (flag == 0) printf("0 0");printf("\n");
}
int main() {int n, m, i;Poly poly1[1080], poly2[1080];memset(mul_res, 0, sizeof(mul_res));memset(add_res, 0, sizeof(add_res));scanf("%d", &n);for (i = 0;i < n;++i)     scanf("%d%d", &poly1[i].coef, &poly1[i].exp);scanf("%d", &m);for (i = 0;i < m;++i)     scanf("%d%d", &poly2[i].coef, &poly2[i].exp);polyAdd(poly1, poly2, n, m);polyMulti(poly1, poly2, n, m);output(mul_res);output(add_res);return 0;
}

02-线性结构3 列车调度

#include<stdio.h>
#define N 100005
int binSearch(int* a, int len,int target) {int l = 0, r = len - 1;while (l < r) {int mid = (l + r) / 2;if (a[mid] < target) l = mid + 1;else r = mid - 1;}return l;
}
int main() {int n,train;int rails[N];int rail_num = 0;scanf("%d", &n);while (n--) {scanf("%d", &train);if (rail_num == 0 || rails[rail_num - 1] < train) {rails[rail_num++] = train;}else {int t = binSearch(rails, rail_num, train);rails[t] = train;}}printf("%d\n", rail_num);return 0;
}

03-树1 树的同构

#include<stdio.h>
#include <stdlib.h>
#define N 20
#define Null -1
typedef struct Node {char data;int lchild;int rchild;
}node;
node tree1[N], tree2[N];
int trans(char c) {if (c == '-') return Null;return c - '0';
}
int buildTree(node tree[]) {int n, i, sum = 0;char c, l, r;scanf("%d", &n);if (n == 0) return Null;for (i = 0;i < n;++i) {getchar();scanf("%c %c %c", &c, &l, &r);tree[i].data = c;tree[i].lchild = trans(l);tree[i].rchild = trans(r);sum += i;if (tree[i].lchild != Null) sum -= tree[i].lchild;if (tree[i].rchild != Null) sum -= tree[i].rchild;}return sum;
}
int isIsomorphic(int root1, int root2) {if (root1 == Null && root2 == Null) return 1;if (root1 == Null || root2 == Null) return 0;if (tree1[root1].data != tree2[root2].data) return 0;return (isIsomorphic(tree1[root1].lchild, tree2[root2].lchild) && isIsomorphic(tree1[root1].rchild, tree2[root2].rchild)) ||((isIsomorphic(tree1[root1].lchild, tree2[root2].rchild) && isIsomorphic(tree1[root1].rchild, tree2[root2].lchild)));/*判断两种情况:1.左边=左边且右边=右边,2.或者交换一下,左边 = 右边,右边 = 左边满足一种情况就可以了,所以用||*/
}
int main() {int root1 = buildTree(tree1);int root2 = buildTree(tree2);if (isIsomorphic(root1, root2)) printf("Yes\n");else printf("No\n");return 0;
}

04-二叉搜索树1 是否同一棵二叉搜索树

#include<stdio.h>
typedef struct node {int data;struct node* left;struct node* right;
} Node;
typedef Node* binTree;
binTree insert(binTree root, int x) {if (root == NULL) {root = (Node*)malloc(sizeof(Node));root->data = x;root->left = root->right = NULL;}else if ((root->data) > x) root->left = insert(root->left, x);else root->right = insert(root->right, x);return root;
}
int judge(binTree a, binTree b) {if (a == NULL && b == NULL) return 1;if (a == NULL || b == NULL) return 0;return (a->data == b->data) && judge(a->left, b->left) && judge(a->right, b->right);
}
binTree buildBST(int n) {int x, i;binTree root = NULL;for (i = 0;i < n;++i) {scanf("%d", &x);root = insert(root, x);}return root;
}
int main() {int n, l, x;int i;while (scanf("%d", &n) && n) {scanf("%d", &l);binTree prim = buildBST(n);while (l--) {binTree tmp = buildBST(n);if (judge(prim, tmp)) printf("Yes\n");else printf("No\n");}}return 0;
}

04-二叉平衡树1 Root of AVL Tree

#include <stdio.h>
#include<stdlib.h>
typedef struct node* nodePtr;
struct node {int val_;nodePtr left;nodePtr right;
};
nodePtr rotateLeft(nodePtr root) {//RR错误要左旋一次nodePtr t = root->right;root->right = t->left;t->left = root;return t;
}
nodePtr rotateRight(nodePtr root) {//ll错误就说右旋了nodePtr t = root->left;root->left = t->right;t->right = root;return t;
}
nodePtr rotateLeftRight(nodePtr root) {root->left = rotateLeft(root->left);return rotateRight(root);
}
nodePtr rotateRightLeft(nodePtr root) {root->right = rotateRight(root->right);return rotateLeft(root);
}
int max(int a, int b) {return a > b ? a : b;
}
int getHeight(nodePtr root) {if (root == NULL) return 0;return max(getHeight(root->left), getHeight(root->right)) + 1;
}
nodePtr insert(nodePtr root, int val) {if (root == NULL) {root = (nodePtr)malloc(sizeof(struct node));root->val_ = val;root->left = root->right = NULL;}else if (val < root->val_) {root->left = insert(root->left, val);if (getHeight(root->left) - getHeight(root->right) == 2)root = val < root->left->val_ ? rotateRight(root) : rotateLeftRight(root);}else {root->right = insert(root->right, val);if (getHeight(root->left) - getHeight(root->right) == -2)root = val > root->right->val_ ? rotateLeft(root) : rotateRightLeft(root);}return root;
}
int main() {int n, val;scanf("%d", &n);nodePtr root = NULL;for (int i = 0; i < n; i++) {scanf("%d", &val);root = insert(root, val);}printf("%d", root->val_);return 0;
}

05-堆 堆中的路径

#include<stdio.h>
#define Max 1024
#define Min -10024
int H[Max], size = 0;void insert(int x) {int i;for (i = size;H[i / 2] > x;i /= 2)H[i] = H[i / 2];H[i] = x;size++;
}
int main() {int n, m, i, x, k;scanf("%d%d", &n, &m);H[size++] = Min;/*从1开始放,0是空缺的,岗哨*/for (i = 0;i < n;++i) {scanf("%d", &x);insert(x);}for (i = 0;i < m;++i) {scanf("%d", &k);printf("%d", H[k]);while (k > 1) {k /= 2;printf(" %d", H[k]);}printf("\n");}return 0;
}

05-哈夫曼编码 哈夫曼编码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 64
typedef struct TNode* HuffmanTree;
/*我也不会,blog:https://blog.csdn.net/m0_37149062/article/details/105641639*/
struct TNode {int weight_;HuffmanTree Left;HuffmanTree Right;
};//哈夫曼树标准定义
typedef struct HeapNode* MinHeap;
struct HeapNode {HuffmanTree Elements[MAXSIZE];int size_;
};
char ch[MAXSIZE];//输入的字符
int N, w[MAXSIZE], total_codes;//编码中含字符个数,以及频率 最优编码长度
MinHeap createHeap() {MinHeap H;H = (MinHeap)malloc(sizeof(struct HeapNode));H->size_ = 0;H->Elements[0] = (HuffmanTree)malloc(sizeof(struct TNode));H->Elements[0]->weight_ = -1;H->Elements[0]->Left = H->Elements[0]->Right = NULL;return H;
}
//创建哈夫曼树结点,这里注意初始化其权重和左右儿子
HuffmanTree createHuffman() {HuffmanTree  T;T = (HuffmanTree)malloc(sizeof(struct TNode));T->Left = T->Right = NULL;T->weight_ = 0;return T;
}
//最小堆的插入
void insert(MinHeap H, HuffmanTree X) {int i = ++H->size_;for (;H->Elements[i / 2]->weight_ > X->weight_;i /= 2)H->Elements[i] = H->Elements[i / 2];H->Elements[i] = X;
}
//最小堆删除元素
HuffmanTree deleteMin(MinHeap H) {HuffmanTree MinTtem, temp;int Parent, Child;MinTtem = H->Elements[1];temp = H->Elements[H->size_--];for (Parent = 1;Parent * 2 <= H->size_;Parent = Child) {Child = Parent * 2;if ((Child != H->size_) && (H->Elements[Child]->weight_ > H->Elements[Child + 1]->weight_))Child++;if (temp->weight_ <= H->Elements[Child]->weight_)break;elseH->Elements[Parent] = H->Elements[Child];}H->Elements[Parent] = temp;return MinTtem;
}
//构建哈夫曼树
HuffmanTree buildHuffman(MinHeap H) {HuffmanTree T;int num = H->size_;for (int i = 1;i < num;i++) {T = createHuffman();T->Left = deleteMin(H);T->Right = deleteMin(H);T->weight_ = T->Left->weight_ + T->Right->weight_;insert(H, T);}T = deleteMin(H);return T;
}
//根据哈夫曼树,计算最优编码长度并返回
int WPL(HuffmanTree root, int depth) {if ((root->Left == NULL) && (root->Right == NULL))return depth * root->weight_;elsereturn WPL(root->Left, depth + 1) + WPL(root->Right, depth + 1);
}//判断是否为最优编码;
int judge() {HuffmanTree T, p;char chl, * codes;codes = (char*)malloc(sizeof(char) * MAXSIZE);int length = 0, flag = 1, wgh, j;T = createHuffman();for (int i = 0;i < N;i++) {getchar();scanf("%c %s", &chl, codes);if (strlen(codes) >= N)flag = 0;else {for (j = 0;chl != ch[j];j++);wgh = w[j];p = T;for (j = 0;j < strlen(codes);j++) {if (codes[j] == '0') {if (!p->Left)p->Left = createHuffman();p = p->Left;}else if (codes[j] == '1') {if (!p->Right)p->Right = createHuffman();p = p->Right;}if (p->weight_) flag = 0;}if (p->Left || p->Right)flag = 0;elsep->weight_ = wgh;}length += strlen(codes) * p->weight_;}if (length != total_codes)flag = 0;return flag;
}int main() {int M;HuffmanTree tmp, ROOT;scanf("%d", &N);MinHeap H = createHeap();//根据输入的字符已经其频率,一个个插入构建最小堆for (int i = 0;i < N;i++) {getchar();scanf("%c %d", &ch[i], &w[i]);tmp = createHuffman();tmp->weight_ = w[i];insert(H, tmp);}ROOT = buildHuffman(H);total_codes = WPL(ROOT, 0);scanf("%d", &M);for (int i = 0;i < M;i++) {if (judge())    printf("Yes\n");else    printf("No\n");}return 0;
}

06-散列查找1 电话聊天狂人

#include<stdio.h>
#include<math.h>
#include<string.h>
#define KEYLEN 11
typedef char ElementType[KEYLEN + 1];
#define MAXD 5/*参与散列映射计算的字符个数,就是最后5位*/
typedef int Index;typedef struct LNode* ptr_LNode;
struct LNode
{ElementType data_;ptr_LNode next;int count_;
};
typedef ptr_LNode Position;
typedef ptr_LNode List;typedef struct Tb1Node* HashTable;
struct Tb1Node
{int size_;List Heads;
};
int isPrime(int x) {int i;for (i = 2;i < (int)sqrt(x) + 1;++i) {if ((x % i) == 0) return 0;}return 1;
}
int nextPrime(int n) {int i;int p = (n % 2 == 0) ? n + 1 : n + 2;for (i = p;;i=i+2) {if (isPrime(i)) return i;}return -1;
}
HashTable createHashTable(int table_size) {HashTable H;int i;H = (HashTable)malloc(sizeof(struct Tb1Node));H->size_ = nextPrime(table_size);H->Heads = (List)malloc(H->size_ * sizeof(struct LNode));for (i = 0;i < H->size_;++i) {H->Heads[i].data_[0] = '\0';H->Heads[i].next = NULL;H->Heads[i].count_ = 0;}return H;
}
int Hash(int key, int p) {/*除留余数法散列函数*/return key % p;
}
Position find(HashTable H, ElementType key) {Index pos = Hash(atoi(key+KEYLEN-MAXD), H->size_);Position p = H->Heads[pos].next;while (p&&strcmp(p->data_,key))p = p->next;return p;
}
int insert(HashTable H, ElementType key) {Position p, new_cell;Index pos;p = find(H, key);if (!p) {/*没找到就插入*/new_cell = (Position)malloc(sizeof(struct LNode));strcpy(new_cell->data_, key);new_cell->count_ = 1;pos = Hash(atoi(key + KEYLEN - MAXD), H->size_);new_cell->next = H->Heads[pos].next;H->Heads[pos].next = new_cell;return 1;}else {p->count_++;return 0;}
}
void scanAndOutput(HashTable H) {int i, max_cnt, person_cnt;max_cnt = person_cnt = 0;List ptr;ElementType min_phone;min_phone[0] = '\0';for (i = 0;i < H->size_;++i) {ptr = H->Heads[i].next;while (ptr){if (ptr->count_ > max_cnt) {max_cnt = ptr->count_;strcpy(min_phone, ptr->data_);person_cnt = 1;}else if (ptr->count_ == max_cnt) {person_cnt++;if (strcmp(min_phone, ptr->data_) > 0)strcpy(min_phone, ptr->data_);}ptr = ptr->next;}}printf("%s %d", min_phone, max_cnt);if (person_cnt > 1) printf(" %d", person_cnt);printf("\n");
}
void destroyHashTable(HashTable H) {Position pos, tmp;int i;for (i = 0;i < H->size_;++i) {pos = H->Heads[i].next;while (pos){tmp = pos->next;free(pos);pos=tmp;}}free(H->Heads);free(H);
}
int main() {// printf("%d", nextPrime(7));int n, i;ElementType key;scanf("%d", &n);//创建散列表HashTable H = createHashTable(2*n);//读入号码,插入表中for (i = 0;i < n;++i) {scanf("%s", key);insert(H, key);scanf("%s", key);insert(H, key);}//扫描输出狂人scanAndOutput(H);destroyHashTable(H); return 0;
}

07-图的遍历 列出连通集

#include<stdio.h>
#include<string.h>
#define N 20
#define INF 0x3f3f3f3f
int G[N][N];
//DFS
int vis[N];
int ans[N];
void DFS(int n, int v) {int i;printf("%d ", v);vis[v] = 1;for (i = 1;i < n;++i) {if (!vis[i] && G[v][i] == 1) {DFS(n, i);}}
}
int queue[N];
int head = 0, tail = 0;
void BFS(int n, int v) {int i;printf("%d ", v);vis[v] = 1;queue[tail++] = v;while (head < tail) {int tmp = queue[head++];for (i = 0;i < n;++i) {if (!vis[i] && G[tmp][i] == 1) {printf("%d ", i);vis[i] = 1;queue[tail++] = i;}}}
}
void init() {int i, j;memset(vis, 0, sizeof(vis));for (i = 0;i < N;++i)for (j = 0;j < N;++j)G[i][j] == (i == j) ? 0 : INF;
}
int main() {int n, e, i, v1, v2;init();scanf("%d%d", &n, &e);for (i = 0;i < e;++i) {scanf("%d%d", &v1, &v2);G[v1][v2] = G[v2][v1] = 1;}for (i = 0;i < n;++i) {if (!vis[i]) {printf("{ ");DFS(n, i);printf("}\n");}}memset(vis, 0, sizeof(vis));for (i = 0;i < n;++i) {if (!vis[i]) {printf("{ ");BFS(n, i);printf("}\n");}}return 0;
}

08-最短路径 哈利·波特的考试(方法一 floyd)

#include<stdio.h>
#include<string.h>
#define N 201
#define INF 0X3F3F3F3F
int G[N][N];
void floyd(int n) {int i, j, k;for (k = 1;k <= n;++k)for (i = 1;i <= n;++i)for (j = 1;j <= n;++j)if (G[i][j] > G[i][k] + G[k][j])G[i][j] = G[i][k] + G[k][j];
}
int main() {int n, m, i, j, v1, v2, w, k;for (i = 0;i < N;++i)for (j = 0;j < N;++j)G[i][j] = (i == j) ? 0 : INF;scanf("%d%d", &n, &m);for (i = 0;i < m;++i) {scanf("%d%d%d", &v1, &v2, &w);G[v1][v2] = G[v2][v1] = w;}floyd(n);int min_v=0, max_path=INF;for (i = 1;i <= n;++i) {int tmp_path = 0;for (j = 1;j <= n;++j) {if (G[i][j] == INF) {printf("0\n");return 0;}tmp_path = tmp_path > G[i][j] ? tmp_path : G[i][j];}if (tmp_path < max_path) {min_v = i;max_path = tmp_path;}}printf("%d %d\n", min_v, max_path);return 0;
}

08-最短路径 哈利·波特的考试(方法二 dijkstra)

#include<stdio.h>
#include<string.h>
#define N 201
#define INF 0X3F3F3F3F
int G[N][N];
int vis[N];
int dis[N];
void init() {int i;memset(vis, 0, sizeof(vis));for (i = 0;i < N;++i) dis[i] = INF;
}
int dijkstra(int n, int v) {int i, j;vis[v] = 1;for (i = 0;i < n;++i) dis[i] = G[v][i];for (i = 1;i < n;++i) {int min_dis = INF;int min_v = 0;for (j = 0;j < n;++j) {if (!vis[j] && dis[j] < min_dis) {min_dis = dis[j];min_v = j;}}if (min_dis == INF) break;vis[min_v] = 1;for (j = 0;j < n;++j) {if (!vis[j] && dis[j] > min_dis + G[min_v][j]) {dis[j] = min_dis + G[min_v][j];}}}if (i == n) {int max_path = 0;for (j = 0;j < n;++j) {max_path = (max_path > dis[j]) ? max_path : dis[j];}return max_path;}else  return -1;
}
void findMinV(int n) {int i,min_v = 0, max_path = INF;for (i = 0;i < n;++i) {init();int path = dijkstra(n, i);if (path == -1) {printf("0\n");return;}if (max_path > path) {min_v = i;max_path = path;}}printf("%d %d\n", min_v+1, max_path);
}
int main() {int n, m, i, j;int v1, v2, w;for (i = 0;i < N;++i)for (j = 0;j < N;++j)G[i][j] = (i == j) ? 0 : INF;scanf("%d%d", &n, &m);for (i = 0;i < m;++i) {scanf("%d%d%d", &v1, &v2, &w);G[v1 - 1][v2 - 1] = G[v2 - 1][v1 - 1] = w;}findMinV(n);return 0;
}

09-最小生成树 公路村村通

#include<stdio.h>
#include<string.h>
#define N 1005
#define INF 0x3f3f3f3f
int G[N][N];//图
int vis[N];//第i个顶点是否加入点集
int dis[N];//当前点集到所有点的最短距离
void init() {//初始化相关参数int i, j;memset(vis, 0, sizeof(vis));memset(dis, INF, sizeof(dis));for (i = 0;i < N;++i) {for (j = 0;j < N;++j)G[i][j] = (i == j) ? 0 : INF;}
}
void prim(int n) {int i, j, next_v;vis[0] = 1;//加入顶点0for (i = 0;i < n;++i)//加入顶点0后,更新距离dis[i] = G[0][i];for (i = 1;i < n;++i) {//继续找n-1个点int Min = INF;for (j = 1;j < n;++j) {//找到未加入点集的点,该点dis距离最小if (!vis[j] && Min > dis[j]) {Min = dis[j];next_v = j;}}if (Min == INF)   break;//说明没找到,即无法生成MSTvis[next_v] = 1;//记得标记,已加入的点for (j = 0;j < n;++j) {//更新距离if (!vis[j] && dis[j] > G[next_v][j])dis[j] = G[next_v][j];}}int ans = 0;if (i == n) {for (i = 0;i < n;++i) ans += dis[i];printf("%d\n", ans);}else    printf("-1\n");
}
int main() {int n, m;int v1, v2, w;init();scanf("%d%d", &n, &m);while (m--) {scanf("%d%d%d", &v1, &v2, &w);G[v1 - 1][v2 - 1] = G[v2 - 1][v1 - 1] = w;}prim(n);return 0;
}

09-拓扑排序 任务调度的合理性

#include<stdio.h>
#include<string.h>
#define N 105
int G[N][N];
int in[N];
int queue[N];
int canTopoSort(int n) {int head, tail,i;int cnt = 0;head = tail = 0;for (i = 0;i < n;++i) {if (in[i] == 0) {queue[tail++] = i;}}while (head < tail) {int v = queue[head++];cnt++;for (i = 0;i < n;++i) {if (G[v][i]) {in[i]--;if (in[i] == 0) queue[tail++] = i;}}}return cnt == n;
}
int main() {int n, i, k, j, v;memset(in, 0, sizeof(in));scanf("%d", &n);for (i = 0;i < n;++i) {scanf("%d", &k);for (j = 0;j < k;++j) {scanf("%d", &v);G[i][v - 1] = 1;in[v - 1]++;}}if (canTopoSort(n)) printf("1\n");else printf("0\n");return 0;
}

如果各位同学有哪里不明白可以与我一起讨论,预祝各位数据结构考试顺利通过!

2022数据结构习题(知产)相关推荐

  1. c语言 已知某系统在通信联络中,数据结构(习题)..doc

    数据结构(习题). 题1.1 数据结构在计算机内存中的表示是指---. A.数据的存储结构 B.数据元素 C.数据的逻辑结构 D.数据元素之间的关系 题1.2 从逻辑上可把数据结构分为--. A.动态 ...

  2. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

  3. 数据结构c语言版题库编程,数据结构习题库(c语言版)

    <数据结构习题库(c语言版)>由会员分享,可在线阅读,更多相关<数据结构习题库(c语言版)(104页珍藏版)>请在人人文库网上搜索. 1.wages in arrears. 2 ...

  4. 广工 AnyviewC 数据结构习题 第四章

    广工 AnyviewC 数据结构习题 第四章 广工 AnyviewC 数据结构习题 第四章 1[题目]已知某哈希表的装载因子小于1,哈希函数H(key) 2[题目]假设哈希表长为m,哈希函数为H(x) ...

  5. 数据结构 习题 综合复习

    最近在复习数据结构,所以把做的习题做个总结加小知识点,如果大家有遇到这方面的问题就可以参考一下了,废话不多说,直接开始吧. 1.从一个长度为n的顺序表中删除第i个元素(1<= i <= n ...

  6. 广工 AnyviewC 数据结构习题 第五章

    广工 AnyviewC 数据结构习题 第五章 广工 AnyviewC 数据结构习题 第五章 1[题目]试编写如下定义的递归函数的递归算法: 2[题目]试写出求递归函数F(n)的递归算法: 3[题目]求 ...

  7. 数据结构c语言函数大全,数据结构习题库(c语言版).doc

    数据结构习题库(c语言版) 第一章 绪 论 一.基本内容 数据.数据元素.数据对象.数据结构.存储结构和数据类型等概念术语的确定含义.抽象数据类型的定义.表示和实现方法.描述算法的类C语言.算法设计的 ...

  8. 数据结构习题精解 C语言实现+微课视频(习题解答、研考试题、微课视频)

    数据结构习题精解 C语言实现+微课视频(习题解答.研考试题.微课视频) 配套 数据结构.数据结构C语言实现等经典教材的课后习题解答,著名高校典型考研试题详解.微课视频

  9. 头牌知产介绍空气炸锅商标转让类别

    空气炸锅商标转让类别如何选择? 空气炸锅是一种可以用空气来"油炸"的机器.主要用空气代替煎锅中的热油,使食物煮熟:同时,热空气还将食物表面的水分吹走,使食物达到油炸的效果.那么,空 ...

最新文章

  1. A. 位运算符的应用---管理一组事务的开关状态
  2. C++ 拷贝构造函数和重载赋值运算符的区别
  3. vmx转换ofv模板,导入esxi
  4. php 字符串包含另一个字符串_leetcode1433_go_检查一个字符串是否可以打破另一个字符串...
  5. content_scripts css,chrome 扩展开发 中 content_scripts 配置的 文件没有执行?
  6. ElasticSearch Java SpringBoot根据时间范围分组求和
  7. LeetCode-Largest Rectangle in Histogram
  8. linux语言yhq,linux通过docker安装kafka
  9. win764位和32位有什么区别_32位、64位它们是什么关系?它们又有什么区别?
  10. python列表转化为元组、集合_如何在Python中将元组列表更改为集合?
  11. java项目中用了Disruptor之后,性能提升了10倍
  12. 6.解决循环依赖的问题
  13. sqlserver 游标写法
  14. JavaScript学习指南集锦
  15. 有趣的计算机黑科技,6个让你欲罢不能的电脑黑科技软件,我一定要分享出来!...
  16. 智能烟感与物联网卡可以了解一波
  17. jmp连mysql_JMP官方教学视频列表
  18. FIB常见应用明细及原理分析
  19. Java HTTPS客户端如何处理证书
  20. java使用oshi获取硬件信息,包括cpu温度

热门文章

  1. 路由配置与管理——静态路由配置与管理
  2. Go之Go语言是什么?Go有什么特点?Go语言的应用前景如何?
  3. 银行家算法——C++实现 [ 开源代码 + 详细解析 ]
  4. 【云原生】K8s简介之什么是K8s
  5. 2017年第一次专题研讨会论坛成果:自行车和城市可持续发展国际案例
  6. OpenLayers 加载天地图模糊的问题 OpenLayers 地图缩放模糊
  7. 中国首届微博开发者大会杨卫华演讲
  8. Ubuntu 更换清华大学镜像源
  9. 科研伦理与学术规范 期末考试1(50题)
  10. qconf 配置中心 php,QConf