test2

本文通过具体的代码实例展示了多种图算法的实现过程,包括迪杰斯特拉最短路径算法、克鲁斯卡尔最小生成树算法及普里姆算法等,旨在帮助读者深入理解这些经典算法的工作原理。
<pre class="cpp" name="code"><pre class="cpp" name="code"><pre class="cpp" name="code"><pre class="cpp" name="code">#include <stdlib.h>
#include <stdio.h>
#include <queue>

using namespace std;

#define VERTEXS 5
#define EDGES   10
#define MAXN   100
#define INFINITY 0x1fffffff
#define NIL -1

typedef struct edge {
	int u, v;    // 起点,终点
	int weight;  // 边的权重
} Edge;

/*priority_queue<int> Q;*/
vector<int> S;
int dis[VERTEXS];
int pa[VERTEXS]; // previous
char elem[VERTEXS] = {'s', 't', 'x', 'y', 'z'};
// Edge edge[EDGES] = {
// 	{0, 1, 10}, {0, 3, 5}, {1, 2, 1}, {1, 3, 2}, {2, 4, 4},
// 	{3, 1, 3}, {3, 2, 9}, {3, 4, 2}, {4, 0, 7}, {4, 2, 6}
// };
// int Graph[VERTEXS][VERTEXS] = {
//  // s,  t, x, y, z
//     0, 10, 0, 5, 0, // s
//     0,  0, 1, 2, 0, // t
//     0,  0, 0, 0, 4, // x
//     0,  3, 9, 0, 2, // y
//     7,  0, 6, 0, 0  // z
// };

int Graph[VERTEXS][VERTEXS] = {
	// s,  t, x, y, z
	INFINITY,  10,       INFINITY, 5,        INFINITY, // s
	INFINITY,  INFINITY, 1,        2,        INFINITY, // t
	INFINITY,  INFINITY, INFINITY, INFINITY, 4, // x
	INFINITY,  3,        9,        INFINITY, 2, // y
	7,         INFINITY, 6,        INFINITY, INFINITY  // z
};

bool bVisit[VERTEXS] = {false};
int Q[VERTEXS];

// void IntializeQueue(int *Q)
// {
// 	for (int i = 0; i < VERTEXS; i++)
// 		Q[i] = dis[i];
// }

int ExtractMin(int *Q)
{
	int min = INFINITY + 1; // 记录最小值
	int index = 0;      // 记录最小值下标
	for (int i = 0; i < VERTEXS; i++) {
		if (!bVisit[i] && Q[i] < min) {
			min = Q[i];
			index = i;
		}
	}
	bVisit[index] = true;

	return index;
	/*return min;*/
}

bool IsEmpty(int *Q)
{
	for (int i = 0; i < VERTEXS; i++) {
		if (!bVisit[i])
			return false;
	}

	return true;
}

void IntializeSingleSource(int s)
{
	for (int i = 0; i < VERTEXS; i++) {
		dis[i] = INFINITY;
		pa[i] = NIL;
	}
	dis[s] = 0;
}

int g_n = 0;

void Relax(int u, int v, int w)
{
	if (dis[v] > dis[u] + w) {
		dis[v] = dis[u] + w;
		pa[v] = u;
		Q[++g_n] = dis[v];
	}
}

void Dijkstra(int s)
{
	IntializeSingleSource(s);
	
	S.empty();
	/*IntializeQueue(Q);*/
	Q[g_n] = dis[s];

	while (!IsEmpty(Q)) {
		int u = ExtractMin(Q); // 返回最小值索引
		S.push_back(u);
		for (int v = 0; v < VERTEXS; v++) {
			if (Graph[u][v] != INFINITY)
				Relax(u, v, Graph[u][v]);
		}
	}
}

void PrintPath(int s, int v)
{
	if (s == v) {
		printf("(%c, %d)\t", elem[s], dis[s]);
	} else if (pa[v] == NIL){
		printf("no path from\n");
	} else {
		PrintPath(s, pa[v]);
		printf("(%c, %d)\t", elem[v], dis[v]);
	}
}

int main()
{
	Dijkstra(0);

	for (int i = 0; i < VERTEXS; i++) {
		PrintPath(0, i);
		printf("\n");
	}

	for (vector<int>::iterator it = S.begin(); it != S.end(); ++it) {
		printf("%d\t", *it);
	}
	printf("\n");
 
// 	IntializeQueue(Q);
// 
// 	for (int i = 0; i < VERTEXS; i++) {
// 		printf("%d\t", Q[i]);
// 	}
// 	printf("\n");
// 
// 	for (int i = 0; i < VERTEXS; i++) {
// 		int u = ExtractMin(Q);
// 		printf("%d\t", u);
// 	}
// 	printf("\n");

	system("pause");
	return 0;
}



#include <stdio.h>#include <stdlib.h>#define BUFSIZE 100#define VERTEXS 10typedef struct {int u;int v;int weight;} edge;edge e[BUFSIZE];int parent[BUFSIZE]; // 表示x的父节点int rank[BUFSIZE]; // x的高度int sweight = 0;int Graph[VERTEXS][VERTEXS] = {//a, b, c, d, e, f, g, h, i, j0, 1, 1, 0, 0, 0, 0, 0, 0, 0, //a1, 0, 1, 1, 0, 0, 0, 0, 0, 0, //b1, 1, 0, 0, 0, 0, 0, 0, 0, 0, //c0, 1, 0, 0, 0, 0, 0, 0, 0, 0, //d0, 0, 0, 0, 0, 1, 1, 0, 0, 0, //e0, 0, 0, 0, 1, 0, 0, 0, 0, 0, //f0, 0, 0, 0, 1, 0, 0, 0, 0, 0, //g0, 0, 0, 0, 0, 0, 0, 0, 1, 0, //h0, 0, 0, 0, 0, 0, 0, 0, 1, 0, //i0, 0, 0, 0, 0, 0, 0, 0, 0, 0 //j};void MakeSet(int x){parent[x] = x;rank[x] = 0;}int FindSet(int x){if (x != parent[x])parent[x] = FindSet(parent[x]);return parent[x];}int Compare(const void *a, const void *b){return ((edge *)a)->weight - ((edge *)b)->weight;}void Link(int x, int y){if (rank[x] > rank[y]){parent[y] = x;} else {parent[x] = y;if (rank[x] == rank[y])rank[y]++;}}void UnionSet(int x, int y, int w){Link(FindSet(x), FindSet(y));sweight += w;}// 有相同的根bool SameComponent(int x, int y){return (FindSet(x) == FindSet(y));}// void ConnectedComponent()// {// for (int i = 0; i < VERTEXS; i++)// MakeSet(i);// for (int i = 0; i < VERTEXS; i++) {// for (int j = 0; j < VERTEXS; j++) {// if (Graph[i][j] == 1 && !SameComponent(i, j))// UnionSet(i, j);// }// }// }int main(){int n; // 边的个数printf("Please enter the number of edges:");scanf("%d", &n);getchar();for (int i = 0; i < BUFSIZE; i++) {MakeSet(i);}// 输入边的信息for (int i = 0; i < n; i++) {scanf(("%c %c %d"), &(e[i].u), &(e[i].v), &(e[i].weight));getchar();e[i].u -= 'a';e[i].v -= 'a';}// sort the edges of E into nondecreasing order by weight qsort(e, n, sizeof(edge), Compare);for (int i = 0; i < n; i++) {int x = FindSet(e[i].u);int y = FindSet(e[i].v);if (x != y) { // 开环printf("%c---%c:%d\n", e[i].u + 'a', e[i].v + 'a', e[i].weight);UnionSet(x, y, e[i].weight);}}printf("Total weight:%d\n", sweight);system("pause");return 0;}


#include <stdio.h>#include <stdlib.h>#define MAXN 100#define INFINITY 999999#define VERTEXS 9int adj[VERTEXS][VERTEXS] = { //a, b, c, d, e, f, g, h, i INFINITY, 4, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, 8, INFINITY, // a 4, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, 11, INFINITY, // b INFINITY, 8, INFINITY, 7, INFINITY, 4, INFINITY, INFINITY, 2, // c INFINITY, INFINITY, 7, INFINITY, 9, 14, INFINITY, INFINITY, INFINITY, // d INFINITY, INFINITY, INFINITY, 9, INFINITY, 10, INFINITY, INFINITY, INFINITY, // e INFINITY, INFINITY, 4, 14, 10, INFINITY, 2, INFINITY, INFINITY, // f INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, 2, INFINITY, 1, 6, // g 8, 11, INFINITY, INFINITY, INFINITY, INFINITY, 1, INFINITY, 7, // h INFINITY, INFINITY, 3, INFINITY, INFINITY, INFINITY, 6, 7, INFINITY // i};// 找出最小未访问点int ExtractMin(int *v, int n, bool *visited){int min = INFINITY;int m = -1;for (int i = 0; i < n; i++) {if (!visited[i] && v[i] < min) {min = v[i];m = i;}}return m;}// n为顶点数int Prim(int s, int n){int *ve = (int *)malloc(n * sizeof(int));bool *visied = (bool *)malloc(n * sizeof(bool));for (int i = 0; i < n; i++) {ve[i] = INFINITY;visied[i] = false;}ve[s] = 0;int len = 0;for (int i = 0; i < n; i++) {int u = ExtractMin(ve, n, visied);visied[u] = true;len += ve[u];printf("%d\t", ve[u]);for (int v = 0; v < n; v++) {if (!visied[v] && adj[u][v] < ve[v]) {ve[v] = adj[u][v];}} }printf("\n");free(ve);free(visied);return len;}int main(){int minlen = Prim(0, VERTEXS);printf("minlen = %d\n", minlen);system("pause");return 0;}


#include <stdio.h>#include <stdlib.h>#include <list>#include <stack>using namespace std;#define VERTEX 6#define NIL -1typedef struct s {int v[VERTEX];int size;} STACK;void sinit(STACK *S){(*S).size = -1;}void spush(STACK *S, int val) // 注意传参为副本{if ((*S).size == VERTEX - 1) {printf("stack is full!\n");} else {(*S).v[++(*S).size] = val;}}int spop(STACK *S){if ((*S).size == 0) {printf("stack is empty!\n");} else {return (*S).v[(*S).size--];}}int ssize(STACK *S){return (*S).size + 1;}enum COLORFLAG {WHITE = 0, GRAY, BLACK};COLORFLAG cf[VERTEX];int dis[VERTEX]; // discover timeint fin[VERTEX]; // finish timeint pv[VERTEX]; // record parentint vertex[VERTEX];int time;/*stack<int> S;*/list<int> L;STACK S;int graph[VERTEX][VERTEX] = {// u, v, w, x, y, z 0, 1, 0, 1, 0, 0, //u 0, 0, 0, 0, 1, 0, //v 0, 0, 0, 0, 1, 1, //w 0, 1, 0, 0, 0, 0, //x 0, 0, 0, 1, 0, 0, //y 1, 0, 0, 0, 0, 0 //z};// u--->v w // | / | / |// x<---y z// (u, v), (u, x), (v, y), (w, y), (w, z), (x, v), (y, x), (z, z)// u成为深度优先森林中一棵新树的根void DFS_Visit(int u){time += 1; // white vertex u has just been discovereddis[u] = time;cf[u] = GRAY;for (int i = 0; i < VERTEX; i++) {if (graph[u][i] == 1) { // (u, i)if (cf[i] == WHITE) {pv[i] = u;DFS_Visit(i);}}}time += 1; // blacken u; it is finishedfin[u] = time;cf[u] = BLACK; L.push_front(u);}void DFS() // start;{for (int u = 0; u < VERTEX; u++) {cf[u] = WHITE;dis[u] = fin[u] = 0;pv[u] = NIL;}time = 0;for (int u = 0; u < VERTEX; u++) {if (cf[u] == WHITE) {DFS_Visit(u);}}}int main(){sinit(&S);DFS();// for (int i = 0; i < /*S.size()*/ssize(&S); i++) {// int val = /*S.top()*/spop(&S);// printf("(%d, %d, %d)\t", val, dis[val], fin[val]);// /*S.pop();*/// }for (list<int>::iterator it = L.begin(); it != L.end(); ++it) {int val = *(it);printf("(%d, %d, %d)\t", val, dis[val], fin[val]);}system("pause");return 0;}


#include <stdio.h>#include <stdlib.h>#include <queue>using namespace std;#define VERTEX 8#define NIL -1enum COLORFLAG {WHITE = 0, GRAY, BLACK};COLORFLAG cf[VERTEX];int dis[VERTEX];int pv[VERTEX]; // record parentint vertex[VERTEX];int graph[VERTEX][VERTEX] = { //r, s, t, u, v, w, x, y0, 1, 0, 0, 1, 0, 0, 0, //r1, 0, 0, 0, 0, 1, 0, 0, //s0, 0, 0, 0, 0, 1, 1, 0, //t0, 0, 0, 0, 0, 0, 1, 1, //u1, 0, 0, 0, 0, 0, 0, 0, //v0, 1, 1, 0, 0, 0, 1, 0, //w0, 0, 1, 1, 0, 1, 0, 1, //x0, 0, 0, 1, 0, 0, 1, 0, //y};// r---s t u// | | / | / |// u w---x---y// s r w u t x v yvoid BFSearch(int s) // start;{queue<int> Q;for (int i = 0; i < VERTEX; i++) {cf[i] = WHITE;dis[i] = 0;pv[i] = 0;}cf[s] = GRAY;dis[s] = 0;pv[s] = 0;Q.push(s);while (!Q.empty()) {s = Q.front();Q.pop();for (int i = 0; i < VERTEX; i++) {if (graph[s][i] == 1) {if (cf[i] == WHITE) { // (s, i)相连cf[i] = GRAY;dis[i] = dis[s] + 1;pv[i] = s;Q.push(i);}}}cf[s] = BLACK;printf("(%d, %d, %d)\t", s, dis[s], pv[s]);}}int main(){BFSearch(1);system("pause");return 0;}


在车辆工程中,悬架系统的性能评估和优化一直是研究的热点。悬架不仅关乎车辆的乘坐舒适性,还直接影响到车辆的操控性和稳定性。为了深入理解悬架的动态行为,研究人员经常使用“二自由度悬架模型”来简化分析,并运用“传递函数”这一数学工具来描述悬架系统的动态特性。 二自由度悬架模型将复杂的车辆系统简化为两个独立的部分:车轮和车身。这种简化模型能够较准确地模拟出车辆在垂直方向上的运动行为,同时忽略了侧向和纵向的动态影响,这使得工程师能够更加专注于分析与优化与垂直动态相关的性能指标。 传递函数作为控制系统理论中的一种工具,能够描述系统输入和输出之间的关系。在悬架系统中,传递函数特别重要,因为它能够反映出路面不平度如何被悬架系统转化为车内乘员感受到的振动。通过传递函数,我们可以得到一个频率域上的表达式,从中分析出悬架系统的关键动态特性,如系统的振幅衰减特性和共振频率等。 在实际应用中,工程师通过使用MATLAB这类数学软件,建立双质量悬架的数学模型。模型中的参数包括车轮质量、车身质量、弹簧刚度以及阻尼系数等。通过编程求解,工程师可以得到悬架系统的传递函数,并据此绘制出传递函数曲线。这为评估悬架性能提供了一个直观的工具,使工程师能够了解悬架在不同频率激励下的响应情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值