【資料結構】圖的應用-Floyd
阿新 • • 發佈:2019-01-13
圖的應用
學校要建立一個娛樂中心,設計該娛樂中心的位置,使得各部門到中心的距離較近。
基本要求:
(1)頂點表示各部門,頂點之間連線上的權值表示兩個部門的距離;
(2)採用鄰接表儲存圖;
(3)採用Flody演算法求最短路徑;
(4)輸出各路徑及其距離。
測試資料要求:
輸入表示權值的整數必須是正整數。
/* (1)頂點表示各部門,頂點之間連線上的權值表示兩個部門的距離; (2)採用鄰接表儲存圖; (3)採用Flody演算法求最短路徑; (4)輸出各路徑及其距離。 */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #define N 100 #define inf 0x3f3f3f3f #define VertexType int using namespace std; typedef struct ArcNode{ int adjvex; int weight; struct ArcNode *next; ArcNode(int a=0,int w=0,struct ArcNode *Next=NULL): adjvex(a),weight(w),next(Next){} }ArcNode ; typedef struct VNode{ VertexType data; ArcNode *first; }VNode; typedef struct{ VNode v[N]; int n,m; }ALGraph; ALGraph G; int a[N][N],path[N][N],n,m; int LocateVex(ALGraph G,VertexType v){ for(int i=0;i<G.n;i++){ if(G.v[i].data==v){ return i; } } } void CreateGraph(ALGraph &G){ int u,v,i,j,k,w; scanf("%d%d",&G.n,&G.m); for(int i=0;i<G.n;i++){ //scanf("%d",&G.v[i].data); G.v[i].data=i; G.v[i].first=NULL; } for(int k=0;k<G.m;k++){ scanf("%d%d%d",&u,&v,&w); i=LocateVex(G,u); if(i==-1){ printf("error\n"); return ;} j=LocateVex(G,v); if(j==-1){ printf("error\n"); return ;} ArcNode * s=new ArcNode(G.v[j].data,w,NULL); //s->adjvex=G.v[j].data; //s->weight=w; //s->next=NULL; if(!G.v[i].first){ G.v[i].first=s; }else{ ArcNode * p = G.v[i].first; while(p->next){ p=p->next; } p->next=s; } } for(int i=0;i<=G.n;i++){ for(int j=0;j<=G.n;j++){ a[i][j]=inf; } } for(int i=0;i<G.n;i++){ for(ArcNode *p=G.v[i].first; p;p=p->next){ a[G.v[i].data][p->adjvex]=p->weight; a[p->adjvex][G.v[i].data]=p->weight; } } for(int i=0;i<=G.n;i++){ for(int j=0;j<=G.n;j++){ printf("(%d,%d)=%d\n",i,j,a[i][j]); } } n=G.n;m=G.m; } void input(){ int u,v,w; scanf("%d%d",&n,&m); for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ a[i][j]=inf; } } for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); a[u][v]=a[v][u]=w; } } void Flody(){ int d[N][N]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ d[i][j]=a[i][j]; if(i!=j&&a[i][j]<inf) path[i][j]=i; else path[i][j]=-1; } } for(int k=0;k<n;k++){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(d[i][k]+d[k][j]<d[i][j]){ d[i][j]=d[i][k]+d[k][j]; path[i][j]=path[k][j]; } } } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i!=j){ printf("起點: %d , 終點: %d\n",i,j); int p=path[i][0]; if(p==-1){ printf("無路徑\n"); }else{ int m=0,b[N]={0}; b[m++]=j; while(p!=i){ b[m++]=p;p=path[i][p]; } b[m]=i; for(int k=m;k>0;k--){ if(k==1&&b[0]==b[k]){ break; } printf("%d->",b[k]); } printf("%d 長度為: %d\n",b[0],d[i][j]); } } } } } int main() { CreateGraph(G); //input(); Flody(); } /* 4 5 0 1 4 0 2 1 0 3 4 1 2 2 2 3 2 */
修正版:
string把地點對應的名字存下來了。
/* (1)頂點表示各部門,頂點之間連線上的權值表示兩個部門的距離; (2)採用鄰接表儲存圖; (3)採用Flody演算法求最短路徑; (4)輸出各路徑及其距離。 */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> #include<algorithm> #define N 100 #define inf 0x3f3f3f3f #define VertexType string using namespace std; //鄰結點 typedef struct ArcNode{ int adjvex; int weight; struct ArcNode *next; ArcNode(int a=0,int w=0,struct ArcNode *Next=NULL): adjvex(a),weight(w),next(Next){} }ArcNode ; //頂點的頭節點 typedef struct VNode{ VertexType data; ArcNode *first; }VNode; //鄰接表 typedef struct{ VNode v[N]; int n,m; }ALGraph; int a[N][N]; string Map[N]; //輸入的v查詢對應的位置 下標 int LocateVex(ALGraph G,VertexType v){ for(int i=0;i<G.n;i++){ if(G.v[i].data==v){ return i; } } return -1; } //使用者輸入圖的資訊 void CreateGraph(ALGraph &G){ string u,v; //int u,v; int i,j,k,w; cin>>G.n>>G.m; //scanf("%d%d",&G.n,&G.m); for(int i=0;i<G.n;i++){ cin>>G.v[i].data; Map[i]=G.v[i].data; //scanf("%d",&G.v[i].data); //G.v[i].data='0'+i; G.v[i].first=NULL; } for(int k=0;k<G.m;k++){ cin>>u>>v>>w; //cout<<u<<v<<w<<endl; //scanf("%d%d%d",&u,&v,&w); i=LocateVex(G,u); if(i==-1){ printf("error\n"); return ;} j=LocateVex(G,v); if(j==-1){ printf("error\n"); return ;} ArcNode * s=new ArcNode(j,w,NULL);//G.v[j].data //s->adjvex=G.v[j].data; //s->weight=w; //s->next=NULL; if(!G.v[i].first){ G.v[i].first=s; }else{ ArcNode * p = G.v[i].first; while(p->next){ p=p->next; } p->next=s; } } for(int i=0;i<=G.n;i++){ for(int j=0;j<=G.n;j++){ a[i][j]=inf; } } for(int i=0;i<G.n;i++){ for(ArcNode *p=G.v[i].first; p;p=p->next){ a[i][p->adjvex]=p->weight;//G.v[i].data a[p->adjvex][i]=p->weight;//G.v[i].data } } /* for(int i=0;i<=G.n;i++){ for(int j=0;j<=G.n;j++){ printf("(%d,%d)=%d\n",i,j,a[i][j]); } } n=G.n;m=G.m; */ } //跑Flody 計算每兩點間最短距離,並且記錄路徑 void Flody(ALGraph &G){ int d[N][N],n=G.n,m=G.m,path[N][N]; for(int i=0;i<n;i++) for(int j=0;j<n;j++){ d[i][j]=a[i][j]; if(i!=j&&a[i][j]<inf) path[i][j]=i; else path[i][j]=-1; } for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(d[i][k]+d[k][j]<d[i][j]){ d[i][j]=d[i][k]+d[k][j]; path[i][j]=path[k][j]; } for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(i!=j){ cout<<"起點:\t"<<Map[i]<<"\t,終點:\t"<<Map[j]<<endl; //printf("起點: %d , 終點: %d\n",i,j); int p=path[i][0]; if(p==-1){ printf("無路徑\n"); }else{ int m=0,b[N]={0}; b[m++]=j; while(p!=i){ b[m++]=p;p=path[i][p]; } b[m]=i; for(int k=m;k>0;k--){ if(k==1&&b[0]==b[k]){ break; } cout<<Map[b[k]]<<" -> "; //printf("%d->",Map[b[k]]); } cout<<Map[b[0]]<<"\t長度為:\t"<<d[i][j]<<endl<<endl; //printf("%d 長度為: %d\n",Map[b[0]],d[i][j]); } } } int main() { ALGraph G; CreateGraph(G); Flody(G); return 0; } /* //數字輸入 4 5 0 1 2 3 0 1 4 0 2 1 0 3 4 1 2 2 2 3 2 //文字輸入 4 5 一餐 宿舍 交院 逸夫樓 一餐 宿舍 4 一餐 交院 1 一餐 逸夫樓 4 宿舍 交院 2 交院 逸夫樓 2 */