您的位置:

求解矩阵最小路径和问题c语言,c语言求矩阵中最大值最小值及位置

本文目录一览:

怎么用c语言实现单源最短路径问题?要求是用Dijkstra算法,最好写出所有的代码 ,包括结构定义等等,对一

C语言代码://清华大学出版社光盘的代码

void ShortestPath_DIJ(MGraph G,int v0,PathMatrix P,ShortPathTable D)

{ // 算法7.15

// 用Dijkstra算法求有向网G的v0顶点到其余顶点v的最短路径P[v]

// 及其带权长度D[v]。

// 若P[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点。

// final[v]为TRUE当且仅当v∈S,即已经求得从v0到v的最短路径。

int i=0,j, v,w,min;

bool final[MAX_VERTEX_NUM];

for (v=0; vG.vexnum; ++v) {

final[v] = FALSE;

D[v] = G.arcs[v0][v].adj;

for (w=0; wG.vexnum; ++w) P[v][w] = FALSE; // 设空路径

if (D[v] INFINITY) { P[v][v0] = TRUE; P[v][v] = TRUE; }

}

D[v0] = 0; final[v0] = TRUE; // 初始化,v0顶点属于S集

//--- 开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集 ---

for (i=1; iG.vexnum; ++i) { // 其余G.vexnum-1个顶点

min = INFINITY; // 当前所知离v0顶点的最近距离

for (w=0; wG.vexnum; ++w)

if (!final[w]) // w顶点在V-S中

if (D[w]min) { v = w; min = D[w]; } // w顶点离v0顶点更近

final[v] = TRUE; // 离v0顶点最近的v加入S集

for (w=0; wG.vexnum; ++w) // 更新当前最短路径及距离

if (!final[w] (min+G.arcs[v][w].adjD[w])) {

// 修改D[w]和P[w], w∈V-S

D[w] = min + G.arcs[v][w].adj;

for(j=0;jG.vexnum;j++) P[w][j] = P[v][j]; //第v行赋值于第w行

P[w][w] = TRUE; // P[w] = P[v]+[w]

}//if

}//for

} // ShortestPath_DIJ

C语言最短路径

int main()

{

int G[100][100] = {};

//一个记录图的邻接矩阵

int a, b, w;

//输入一共有7条边, 5个点

int i, j, k;

for(i = 1;i = 5;i++)

for(j = 1;j = 5;j++)

G[i][j] = 9999999;

for(i = 1;i = 7;i++)

{

scanf("%d %d %d", a, b, w);//输入每条边的信息,a和b代表这条边的两个顶点w代表两个点的距离

G[a][b] = w;

G[b][a] = w;

}

for(k = 1;k = 5;k++)

for(i = 1;i = 5;i++)

for(j = 1;j = 5;j++)

if(G[i][j] G[i][k] + G[k][j])

G[i][j] = G[i][k] + G[k][j];

printf("%d", G[1][4]);//输出两点之间的最短路,这里的两个点是3和5

return 0;

}

G[i][j]代表i到j的距离,甲,乙,丙,丁,戊用1,2,3,4,5代替

如果你还不懂的话,就看一些关于图论的问题,这个最短路是图论中的一个经典题

c语言数据结构 最短路径问题代码

直接看代码:

#include stdlib.h

#define MAXVEX 10

typedef struct graph{

    int n,e;//顶点数、边数

    char vexs[MAXVEX];//顶点数组

    int arcs[MAXVEX][MAXVEX];//邻接矩阵

    int kind;//类型:0有向图;1无向图;2有向网;3无向网

} MGraph;

void PrintPath(MGraph G,int *p,int i){

    if(p[i]=0){

        PrintPath(G,p,p[i]);//先输出前驱顶点

    }

    printf("%c",G.vexs[i]);//输出本顶点

}

void Dijkstra(MGraph G, int v){

    //用Dijkstra算法求有向网G中序号为v的顶点到

    //其余各顶点的最短路径

    int *s,*d,*p,i,j,k,min;

    if(v0||v=G.n){//顶点编号参数错误

        printf("Dijkstra parameter ERROR! v0 Or v=%d",G.n);

        return;

    }

    s=(int *)malloc(sizeof(int)*G.n);

    d=(int *)malloc(sizeof(int)*G.n);

    p=(int *)malloc(sizeof(int)*G.n);

    for(i=0;iG.n;i++){ //初始化辅助数组,置0

        s[i]=0;d[i]=G.arcs[v][i];

        if(d[i]!=0)p[i]=v; //v是vi的直接前驱

        else p[i]=-1; //-1表示无直接前驱

    }

    s[v]=1;d[v]=0; //确定源点自身的最短路径长度

    printf("Dijkstra: (The shortest path from %c:)\n",G.vexs[v]);

    for(i=0;iG.n-1;i++){

        //确定v到其余n-1个顶点的最短路径

        min=32767;k=-1;

        for(j=0;jG.n;j++){

            //找出路径长度最小的顶点k

            if(!s[j]d[j]!=0d[j]min){

                k=j; min=d[k];

            }

        }

        if(k0){//有未能到达的顶点,把它们输出

            for(j=0;jG.n;++j){

                if(j==v)continue;

                if(s[j]==0){

                    printf("%c-%c: No path.\n",G.vexs[v],G.vexs[j]);

                }

            }

            free(s); free(d); free(p);

            return; //已完成或出现不连通的顶点

        }

        s[k]=1;

        printf("%c-%c: d=%-5d, p=",G.vexs[v],G.vexs[k],d[k]);

        PrintPath(G,p,k);//输出v到i的路径(正序)

        printf("\n");

        for(j=0;jG.n;j++){

            //更新其余顶点的最短路径及前驱

            if(!s[j]G.arcs[k][j]!=0(d[j]==0||d[j]d[k]+G.arcs[k][j])){

                d[j]=d[k]+G.arcs[k][j]; p[j]=k;

            }

        }

    }

    free(s); free(d); free(p);

}

这是单源的最短路径算法。

c语言编程求矩阵的最大值,最小值及所在的位置

#includestdio.h

int a[9][9]={{5,15,9,16,7,10,2,6,3,20}};

//最大值函数声明

int getmax(int *,int *);

//最小值函数声明

int getmin(int *,int *)

//主函数

void main(void)

{

int imax,jmax,imin,jmin;

printf("矩阵最大值为%d,位置为%d行,%d列;",getmax(imax,jmax),imax,jmax);

printf("最小值为%d,位置为%d行,%d列;",getmin(imin,jmin),imin,jmin);

printf("正对角线和为%d!",getlsum());

printf("反对角线和为%d!",getrsum());

}

//求最大值函数

int getmax(int * imax,int * jmax)

{

int max=0;

for(int i=0;i9;i++)

for(int j=0;j9;j++)

{

if(a[i][j]max)

{

*imax=i;

*jmax=j;

max=a[i][j];

}

}

return max;

}

//求最小值函数

int getmin(int * imin,int * jmin)

{

int min=65535;

for(int i=0;i9;i++)

for(int j=0;j9;j++)

{

if(a[i][j]min)

{

*imin=i;

*jmin=j;

min=a[i][j];

}

}

return min;

}

//求正对角线和函数

int getlsum()

{

int sum=0;

for(int i=0;i9;i++)

sum+=a[i][i];

return sum

}

//求反对角线和函数

int getrsum()

{

int sum=0;

for(int i=0;i9;i++)

sum+=a[i][9-i];

return sum;

}

程序写好了,放在一起的,公用一个主函数,如果不要显示哪个功能就把哪块干掉,如果这你都不会我就没办法了!!!

用dijkstra算法解决最短路径问题c语言代码实现时怎样将每一个路径的顶点次序依次输出出来?

void Dijkstra(int n,int v,int dist[],int prev[],int **cost)

{

  int i;

  int j;

    int maxint = 65535;//定义一个最大的数值,作为不相连的两个节点的代价权值

    int *s ;//定义具有最短路径的节点子集s

  s = (int *)malloc(sizeof(int) * n);

    //初始化最小路径代价和前一跳节点值

    for (i = 1; i = n; i++)

    {

        dist[i] = cost[v][i];

        s[i] = 0;

        if (dist[i] == maxint)

        {

            prev[i] = 0;

        }

        else

        {

            prev[i] = v;

        }

    }

    dist[v] = 0;

    s[v] = 1;//源节点作为最初的s子集

    for (i = 1; i  n; i++)

    {

        int temp = maxint;

        int u = v;

        //加入具有最小代价的邻居节点到s子集

        for (j = 1; j = n; j++)

        {

            if ((!s[j])  (dist[j]  temp))

            {

                u = j;

                temp = dist[j];

            }

        }

        s[u] = 1;

        //计算加入新的节点后,更新路径使得其产生代价最短

        for (j = 1; j = n; j++)

        {

            if ((!s[j])  (cost[u][j]  maxint))

            {

                int newdist = dist[u] + cost[u][j];

                if (newdist  dist[j])

                {

                    dist[j] = newdist;

                    prev[j] = u;

                }

            }

        }

    }

}

//展示最佳路径函数

void ShowPath(int n,int v,int u,int *dist,int *prev)

{

 int j = 0;

 int w = u;

 int count = 0;

 int *way ;

 way=(int *)malloc(sizeof(int)*(n+1));

 //回溯路径

 while (w != v)

 {

  count++;

  way[count] = prev[w];

  w = prev[w];

 }

 //输出路径

 printf("the best path is:\n");

 for (j = count; j = 1; j--)

 {

  printf("%d - ",way[j]);

 }

 printf("%d\n",u);

}

//主函数,主要做输入输出工作

void main()

{

 int i,j,t;

  int n,v,u;

  

 int **cost;//代价矩阵

 int *dist;//最短路径代价

 int *prev;//前一跳节点空间

 printf("please input the node number: ");

  scanf("%d",n);

  printf("please input the cost status:\n");

    

 cost=(int **)malloc(sizeof(int)*(n+1));

  for (i = 1; i = n; i++)

  {

      cost[i]=(int *)malloc(sizeof(int)*(n+1));

  }

  //输入代价矩阵

  for (j = 1; j = n; j++)

  {

      for (t = 1; t = n; t++)

      {

          scanf("%d",cost[j][t]);

      }

  }

    

  dist = (int *)malloc(sizeof(int)*n);

  prev = (int *)malloc(sizeof(int)*n);

  printf("please input the source node: ");

  scanf("%d",v);

  //调用dijkstra算法  

  Dijkstra(n, v, dist, prev, cost);

  printf("*****************************\n");

 printf("have confirm the best path\n");

 printf("*****************************\n");

 for(i = 1; i = n ; i++)

 {

  if(i!=v)

  {

   printf("the distance cost  from node %d to node %d is %d\n",v,i,dist[i]);

   printf("the pre-node of node %d is node %d \n",i,prev[i]);

   ShowPath(n,v,i, dist, prev);

  }

 }

}

c语言最短路径问题。

#include stdio.h

#define N 7 /* 顶点数目 */

#define I 999 /* 表示无穷大 */

int graph[N][N] = { /* 图的邻接矩阵 */

{I, 4, 5, 8, I, I, I},

{I, I, I, 6, 6, I, I},

{I, I, I, 5, I, 7, I},

{I, I, I, I, 8, 9, 9},

{I, I, I, I, I, I, 5},

{I, I, I, I, I, I, 4},

{I, I, I, I, I, I, I}

};

int List[N]; /* 存放拓扑序列 */

int TopologicalOrder(); /* 拓扑排序函数 */

void main() /* 主 函 数 */

{

int i, j, k, l;

int ee[N], el[N]; /* 最长最短距离 */

int path_e[N][N], path_l[N][N], n_e[N], n_l[N]; /* 记录路径数据 */

/* 初始化数据 */

for (i = 0; i N; i++) {

n_e[i] = 0; /* 到 i 的最短路线的结点数 */

n_l[i] = 0; /* 到 i 的最长路线的结点数 */

ee[i] = I;

el[i] = 0;

}

ee[0] = el[0] = 0; /* 初始化头结点 */

path_e[0][0] = 0;

path_l[0][0] = 0;

n_e[0] = 1;

n_l[0] = 1;

/* 拓扑排序 */

if (!TopologicalOrder())

return;

/* 对于拓扑序列,运用动态规划步步算出最长路线与最短路线 */

for (i = 0; i N; i++) {

/* 提取拓扑序列的元素 */

k = List[i];

/* 更新它所指向顶点的所有数据 */

for (j = 0; j N; j++) {

/* 寻找指向的顶点 */

if (graph[k][j] != I) {

/* 如果新路径更短 */

if (graph[k][j] + ee[k] ee[j]) {

/* 更新最短路径长度 */

ee[j] = graph[k][j] + ee[k];

/* 更新最短路线 */

for (l = 0; l n_e[k]; l++) {

path_e[j][l] = path_e[k][l];

}

path_e[j][l] = j;

n_e[j] = l + 1;

}

/* 如果新路径更长 */

if (graph[k][j] + el[k] el[j]) {

/* 更新最长路径长度 */

el[j] = graph[k][j] + el[k];

/* 更新最长路线 */

for (l = 0; l n_l[k]; l++) {

path_l[j][l] = path_l[k][l];

}

path_l[j][l] = j;

n_l[j] = l + 1;

}

}

}

}

/* 输出结果到屏幕 */

for (i = 0; i N; i++) {

printf("shortest(%d): %2d Path: ", i + 1, ee[i]);

for (j = 0; j n_e[i]; j++) {

printf("%d ", path_e[i][j] + 1);

}

printf("\n");

printf("longest (%d): %2d Path: ", i + 1, el[i]);

for (j = 0; j n_l[i]; j++) {

printf("%d ", path_l[i][j] + 1);

}

printf("\n");

}

}

int TopologicalOrder()

{

int i, j, top, count;

int indegree[N], Stack[N];

top = 0; /* 栈顶标志 */

for (i = 0; i N; i++) {

indegree[i] = 0; /* 初始化入度 */

for (j = 0; j N; j++) {

if (graph[j][i] != I) { /* 如连通 */

indegree[i]++; /* 入度自增1 */

}

}

if (!indegree[i]){ /* 如入度为零 */

Stack[top++] = i; /* 入栈 */

}

}

count = 0; /* 输出顶点数 */

while (top != 0) {

i = Stack[--top];

List[count++] = i;

for (j = 0; j N; j++) {

if (graph[i][j] != I) { /* 如连通 */

if (!(--indegree[j])) { /* 而且入度为零 */

Stack[top++] = j; /* 入栈 */

}

}

}/* for */

}/* while */

return (count N) ? 0 : 1;

}