test2

来源:互联网 发布:淘宝网评价管理在哪 编辑:程序博客网 时间:2024/05/18 00:29
<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 -1typedef struct edge {int u, v;    // 起点,终点int weight;  // 边的权重} Edge;/*priority_queue<int> Q;*/vector<int> S;int dis[VERTEXS];int pa[VERTEXS]; // previouschar 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, zINFINITY,  10,       INFINITY, 5,        INFINITY, // sINFINITY,  INFINITY, 1,        2,        INFINITY, // tINFINITY,  INFINITY, INFINITY, INFINITY, 4, // xINFINITY,  3,        9,        INFINITY, 2, // y7,         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;}

0 0