logo资料库

C语言实现单源路径、多级调度、最小生成树.docx

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
1.单源最短路径 #include"stdafx.h" #include #include #include #defineMAX_VALUE100000.0 intn;//节点个数 intprev[100];//记录最短路径到i的一个顶点 ints[101]; inta[100][100]; intdist[100]; voiddijkstra(intv) { intnewdist; if(v<1||v>n) return; for(inti=1;i<=n;i++) {//初始设置 dist[i]=a[v][i];//初始时从源点到i的最短路径设为从源点到i的权值 s[i]=1; if(dist[i]==MAX_VALUE)prev[i]=0;//从源点到i没有通路 elseprev[i]=v;//从源点到i有通路时 最短路径前一个结点设为源点 } dist[v]=0;//源点到源点的最短路径为 s[v]=0;//为下面循环中源点不参加比较做准备 for(inti=1;i
{ newdist=dist[u]+a[u][j]; if(newdistj的权值 if(a[i][j]==0.0)a[i][j]=MAX_VALUE;//输入为表示没有通路 改为最大值 if(i==j)a[i][j]=0.0;//i-->i的权值为 } } printf("\n请输入各点名称(0
printf("\n\n"); system("Pause"); } 2.多机调度 #include"stdafx.h" #include #include #include #define N7//作业数 #define M3//机器数 int s[M]={0,0,0};//每台机器当前已分配的作业总耗时 int main(void) { int time[N]={16,14,6,5,4,3,2};//处理时间按从大到小排序 int maxtime=0; if(M >= N) { } else { } maxtime=setwork1(time,N); maxtime=setwork2(time,N); printf("最多耗费时间%d。",maxtime); system("PAUSE"); } //机器数大于待分配作业数 int setwork1(int t[],int n) { } int i; for(i=0;i
//机器数小于待分配作业数 int setwork2(int t[],int n) { } int i; int mi=0; for(i=0;is[i]) { min=i; } return min; { } //求最终结果(最长处理时间) int max(int s[],int num) { int max=s[0]; int i; for(i=1;i
return max; } 3.最小生成树 #include"stdafx.h" #include #include #include #define MAX 100 /* 定义边(x,y),权为w */ typedef struct { int x, y; int w; }edge; edge e[MAX]; /* rank[x]表示x的秩 */ int rank[MAX]; /* father[x]表示x的父节点 */ int father[MAX]; int sum; /* 比较函数,按权值(相同则按x坐标)非降序排序 */ int cmp(const void *a, const void *b) { } if ((*(edge *)a).w == (*(edge *)b).w) { } return (*(edge *)a).x - (*(edge *)b).x; return (*(edge *)a).w - (*(edge *)b).w; /* 初始化集合 */ void Make_Set(int x) { } father[x] = x; rank[x] = 0;
/* 查找x元素所在的集合,回溯时压缩路径 */ int Find_Set(int x) { } if (x != father[x]) { } father[x] = Find_Set(father[x]); return father[x]; /* 合并x,y所在的集合 */ void Union(int x, int y, int w) { sum += w; if (x == y) return; /* 将秩较小的树连接到秩较大的树后 */ if (rank[x] > rank[y]) father[y] = x; { } else { if (rank[x] == rank[y]) { } rank[y]++; father[x] = y; } } /* 主函数 */ int main() { int i, n; int x, y; char chx, chy; /* 读取边的数目 */ printf ("input n:"); scanf("%d", &n); getchar(); /* 读取边信息并初始化集合 */ for (i = 0; i < n; i++)
{ } scanf("%c %c %d", &chx, &chy, &e[i].w); getchar(); e[i].x = chx - 'A'; e[i].y = chy - 'A'; Make_Set(i); /* 将边排序 */ qsort(e, n, sizeof(edge), cmp); sum = 0; for (i = 0; i < n; i++) { } x = Find_Set(e[i].x); y = Find_Set(e[i].y); if (x != y || (!x && !y)) { } printf("%c - %c : %d\n", e[i].x + 'A', e[i].y + 'A', e[i].w); Union(x, y, e[i].w); printf("Total:%d\n", sum); system("pause"); return 0; } 4.矩阵连乘
分享到:
收藏