c語言帶權圖,c語言帶權圖的深度優先遍歷

本文目錄一覽:

怎樣用C語言實現已知起點 將完全帶權圖利用深度遍歷求出所有路徑 比較長度 輸出最短路徑的算法

給你一個作為參考吧

#include iostream

#define INFINITY 32767

#define MAX_VEX 20 //最大頂點個數

#define QUEUE_SIZE (MAX_VEX+1) //隊列長度

using namespace std;

bool *visited; //訪問標誌數組

//圖的鄰接矩陣存儲結構

typedef struct{

char *vexs; //頂點向量

int arcs[MAX_VEX][MAX_VEX]; //鄰接矩陣

int vexnum,arcnum; //圖的當前頂點數和弧數

}Graph;

//隊列類

class Queue{

public:

void InitQueue(){

base=(int *)malloc(QUEUE_SIZE*sizeof(int));

front=rear=0;

}

void EnQueue(int e){

base[rear]=e;

rear=(rear+1)%QUEUE_SIZE;

}

void DeQueue(int e){

e=base[front];

front=(front+1)%QUEUE_SIZE;

}

public:

int *base;

int front;

int rear;

};

//圖G中查找元素c的位置

int Locate(Graph G,char c){

for(int i=0;iG.vexnum;i++)

if(G.vexs[i]==c) return i;

return -1;

}

//創建無向網

void CreateUDN(Graph G){

int i,j,w,s1,s2;

char a,b,temp;

printf(“輸入頂點數和弧數:”);

scanf(“%d%d”,G.vexnum,G.arcnum);

temp=getchar(); //接收回車

G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配頂點數目

printf(“輸入%d個頂點.\n”,G.vexnum);

for(i=0;iG.vexnum;i++){ //初始化頂點

printf(“輸入頂點%d:”,i);

scanf(“%c”,G.vexs[i]);

temp=getchar(); //接收回車

}

for(i=0;iG.vexnum;i++) //初始化鄰接矩陣

for(j=0;jG.vexnum;j++)

G.arcs[i][j]=INFINITY;

printf(“輸入%d條弧.\n”,G.arcnum);

for(i=0;iG.arcnum;i++){ //初始化弧

printf(“輸入弧%d:”,i);

scanf(“%c %c %d”,a,b,w); //輸入一條邊依附的頂點和權值

temp=getchar(); //接收回車

s1=Locate(G,a);

s2=Locate(G,b);

G.arcs[s1][s2]=G.arcs[s2][s1]=w;

}

}

//圖G中頂點k的第一個鄰接頂點

int FirstVex(Graph G,int k){

if(k=0 kG.vexnum){ //k合理

for(int i=0;iG.vexnum;i++)

if(G.arcs[k][i]!=INFINITY) return i;

}

return -1;

}

//圖G中頂點i的第j個鄰接頂點的下一個鄰接頂點

int NextVex(Graph G,int i,int j){

if(i=0 iG.vexnum j=0 jG.vexnum){ //i,j合理

for(int k=j+1;kG.vexnum;k++)

if(G.arcs[i][k]!=INFINITY) return k;

}

return -1;

}

//深度優先遍歷

void DFS(Graph G,int k){

int i;

if(k==-1){ //第一次執行DFS時,k為-1

for(i=0;iG.vexnum;i++)

if(!visited[i]) DFS(G,i); //對尚未訪問的頂點調用DFS

}

else{

visited[k]=true;

printf(“%c “,G.vexs[k]); //訪問第k個頂點

for(i=FirstVex(G,k);i=0;i=NextVex(G,k,i))

if(!visited[i]) DFS(G,i); //對k的尚未訪問的鄰接頂點i遞歸調用DFS

}

}

//廣度優先遍歷

void BFS(Graph G){

int k;

Queue Q; //輔助隊列Q

Q.InitQueue();

for(int i=0;iG.vexnum;i++)

if(!visited[i]){ //i尚未訪問

visited[i]=true;

printf(“%c “,G.vexs[i]);

Q.EnQueue(i); //i入列

while(Q.front!=Q.rear){

Q.DeQueue(k); //隊頭元素出列並置為k

for(int w=FirstVex(G,k);w=0;w=NextVex(G,k,w))

if(!visited[w]){ //w為k的尚未訪問的鄰接頂點

visited[w]=true;

printf(“%c “,G.vexs[w]);

Q.EnQueue(w);

}

}

}

}

//主函數

void main(){

int i;

Graph G;

CreateUDN(G);

visited=(bool *)malloc(G.vexnum*sizeof(bool));

printf(“\n廣度優先遍歷: “);

for(i=0;iG.vexnum;i++)

visited[i]=false;

DFS(G,-1);

printf(“\n深度優先遍歷: “);

for(i=0;iG.vexnum;i++)

visited[i]=false;

BFS(G);

printf(“\n程序結束.\n”);

}

C語言數據結構

#include iostream.h

#include stdlib.h

#define INFINITY 0

#define MAX_VERTEX_NUM 10 //最大頂點數

#define MAX_EDGE_NUM 40 //最大邊數

typedef enum {DG,DN,UDG,UDN}Graphkind;

typedef char VertexType; //頂點數據類型

typedef struct ArcCell

{

int adj; //無權圖,1或0表示相鄰否;帶權圖則是權值。

//int *info;

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{

VertexType vexs[MAX_VERTEX_NUM]; //頂點向量

AdjMatrix arcs; //鄰接矩陣

int vexnum,arcnum; //圖的當前頂點數和弧數。

Graphkind kind;

}MGraph;

int LocateVex(MGraph G,VertexType v1)

{

int i;

for(i=0;iG.vexnum;i++)

if(G.vexs[i]==v1)

return i;

return -1;

}

int CreatUDN(MGraph G)

// 採用數組表示法,構造無向網 G

{

VertexType v1,v2;

int w,j;

cout”輸入圖的頂點數”endl;

cinG.vexnum;

cout”輸入圖的弧數”endl;

cinG.arcnum;

for(int i=0;iG.vexnum;i++)

{

cout”輸入頂點向量”endl;

cinG.vexs[i];

}

for(i=0;iG.vexnum;i++)

for(j=0;jG.vexnum;j++)

{

G.arcs[i][j].adj=INFINITY;

}

for(int k=0;kG.arcnum;++k) //構造鄰接矩陣

{

cout”輸入邊依附的兩個頂點”endl;

cinv1v2;

cout”輸入此邊的權值”endl;

cinw;

i=LocateVex(G,v1);

j=LocateVex(G,v2);

G.arcs[i][j].adj=w;

G.arcs[j][i].adj=G.arcs[i][j].adj;

}

return 1;

}

void dispMGraph(MGraph G)

{

cout”圖的鄰接矩陣圖是:”endl;

for(int i=0;iG.vexnum;i++)

{

for(int j=0;jG.vexnum;j++)

cout” “G.arcs[i][j].adj;

coutendl;

}

}

void main()

{

MGraph G;

CreatUDN(G);

dispMGraph(G);

}

// 鄰接表 表示:

#include iostream.h

#include stdlib.h

#define MAX_VERTEX_NUM 20 //最大頂點數

#define MAX_EDGE_NUM 40 //最大邊數

int visited[ MAX_VERTEX_NUM];

typedef int VertexType ; //頂點數據類型

typedef struct ArcNode

{

int adjvex;

int weight;

struct ArcNode *nextarc;

}ArcNode;

typedef struct VNode

{

VertexType data;

ArcNode *firstarc;

}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct

{

AdjList vertices;

int vexnum,arcnum;

int kind;

}ALGraph;

void CreateDG(ALGraph G)

{

int i,j,k;

ArcNode *p;

cout”創建一個圖:”endl;

cout”頂點數:”; cinG.vexnum;coutendl;

cout”邊數:”; cinG.arcnum; coutendl;

for(i=0;iG.vexnum;i++)

{

G.vertices[i].data=i;

G.vertices[i].firstarc=NULL;

}

for(k=0;kG.arcnum;k++)

{

cout”請輸入第”k+1″條邊:”;

cinij;

p=(ArcNode*)malloc(sizeof(ArcNode));

p-adjvex=j;

p-nextarc=G.vertices[i].firstarc;

G.vertices[i].firstarc=p;

}

}

void Disp(ALGraph G)

{

int i,j;

ArcNode *p;

cout”輸出圖為:”endl;

for(i=0;iG.vexnum;i++)

{

p=G.vertices[i].firstarc;

j=0;

while(p!=NULL)

{

cout”(“i”,”p-adjvex”)”;

p=p-nextarc;

j=1;

}

if(j==1)

coutendl;

}

}

void dfs(ALGraph G,int v) //深度優先遍歷

{

ArcNode *p;

coutv” “;

visited[v]=1;

p=G.vertices[v].firstarc;

while(p!=NULL)

{ if(!visited[p-adjvex])

dfs(G,p-adjvex);

p=p-nextarc;

}

return ;

}

void dfs1(ALGraph G)

{

int i;

for(i=0;iG.vexnum;i++)

if(visited[i]==0)

dfs(G,i);

}

void main()

{

ALGraph G;

CreateDG(G);

int v;

Disp(G);

cout”輸入頂點:”;

cinv;

cout”深度優先序列:”;

dfs1(G);

coutendl;

}

c語言編寫請簡單點。用帶權鄰接矩陣輸入一幅無向圖,使用兩種不同的算法計算出最短路徑長度並輸出路徑。

//Floyed 實現賦權無向圖定點對間的最短路徑,時間複雜度O(n^3)

1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,或者無窮大,如果兩點之間沒有邊相連。

2,對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是更新它。

#includestdio.h

int main()

{

int c[20][20],parth[20][20],i,j,k,t1,t2,t3,n,x,y,re;

printf(“輸入圖的頂點數:”);

scanf(“%d”,n);

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

{

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

{

printf(“輸入邊(%d,%d)的權值,若不存在輸入10000:”,i,j);

scanf(“%d”,c[i][j]);

}

}

如果是有向圖就刪掉這裡”//for(i=1;i=n;i++)

//{

///////////////////////////////////////for(j=1;j=i;j++)

////////////////////////////////////////c[i][j]=c[j][i];

/////////////////////////////////////////}”

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

c[i][i]=0;//自己到自己的權值為0

for(i=1;i=n;i++) //初始化路徑

{

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

parth[i][j]=0;

}

for(k=1;k=n;k++)//k是中間節點,i是起點j是中點。其實就是枚舉中間節點,來求i j 的最短路徑

{

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

{

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

{

t1=c[i][k];

t2=c[k][j];

t3=c[i][j];

if(t1!=10000t2!=10000(t3==10000||t1+t2t3)) //鬆弛 覆蓋原來的最短路

{c[i][j]=t1+t2,parth[i][j]=k;}//記錄i j的中間點是k

}

}

}

while(1)//也可以用遞歸的形式輸出parth

{

printf(“輸入2點:”);

scanf(“%d%d”,x,y);

printf(“最短距離為%d\n”,c[x][y]);

printf(“%d “,x);

re=y;

while(parth[x][y]!=0)

{

printf(“%d “,parth[x][y]);

y=parth[x][y];

}

printf(“%d\n”,re);

}

return 0;

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/188966.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-29 07:59
下一篇 2024-11-29 07:59

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python遍歷集合中的元素

    本文將從多個方面詳細闡述Python遍歷集合中的元素方法。 一、for循環遍歷集合 Python中,使用for循環可以遍歷集合中的每個元素,代碼如下: my_set = {1, 2…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Python如何遍歷字典中的key和value

    本文將詳細講解Python中如何遍歷字典中的key和value,包括多種遍歷方式以及在遍歷過程中的一些應用場景。 一、遍歷字典中的key和value 在Python中,字典是一種無…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • 深度查詢宴會的文化起源

    深度查詢宴會,是指通過對一種文化或主題的深度挖掘和探究,為參與者提供一次全方位的、深度體驗式的文化品嘗和交流活動。本文將從多個方面探討深度查詢宴會的文化起源。 一、宴會文化的起源 …

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28

發表回復

登錄後才能評論