演算法與資料結構實驗四
實驗專案名稱:實驗四
一、 實驗目的
1)掌握圖的鄰接矩陣、鄰接表儲存結構表示及其建立演算法
2)掌握圖的深度優先搜尋遍歷演算法和圖的廣度優先搜尋遍歷演算法;
3)掌握圖的最短路徑的演算法。
二、 實驗內容
7-1 鄰接表儲存實現圖的深度優先遍歷
編寫程式,實現由鄰接表儲存實現無向圖的深度優先搜尋遍歷的功能。頂點為字元型。
輸入格式:
第一行輸入頂點個數及邊的個數,第二行依次輸入各頂點,第三行開始依次輸入邊的兩個頂點,用空格分開。最後輸入深度優先遍歷的起始點。
輸出格式:
輸出深度優先遍歷結果,空格分開,若起始點不合理,則輸出error。
輸入樣例:
在這裡給出一組輸入。例如:
8 9
0 1 2 3 4 5 6 7
0 1
0 2
1 3
1 4
2 5
2 6
3 7
4 7
5 6
0
輸出樣例:
在這裡給出相應的輸出。例如:
0 2 6 5 1 4 7 3
7-2 迪傑斯特拉方法實現最短路徑
用迪傑斯特拉演算法實現有向網的最短路徑
輸入格式:
第一行輸入有向網的頂點和邊數,第二行輸入各頂點值,用空格間隔,第三行開始輸入各條邊的 兩個點的及邊上的權值,用空格間隔。最後一行輸入要求路徑的兩個頂點。
輸出格式:
輸出最短路徑經過的各頂點,中間用-->連線。
輸入樣例:
在這裡給出一組輸入。例如:
6 8
0 1 2 3 4 5
0 2 10
0 4 30
0 5 100
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
0 3
輸出樣例:
在這裡給出相應的輸出。例如:
0-->4-->3
三、 設計文件
四、 源程式
7-1 鄰接表儲存實現圖的深度優先遍歷
#include<iostream>
#include<cstdio>
using namespace std;
struct edge{
int v;
edge* next;
};
struct node{
char val;
edge* next;
}a[1010];
int n;
int find(char ch){
for(int i=0;i<n;i++){
if(a[i].val==ch){
return i;
}
}
return -1;
}
void add(int u,int v){
edge* e=new edge();
e->next=a[u].next;
e->v=v;
a[u].next=e;
}
bool st[1010];
void dfs(int u){
cout<<a[u].val<<' ';
st[u]=1;
edge* e=a[u].next;
while(e!=NULL){
if(st[e->v]==0){
dfs(e->v);
}
e=e->next;
}
}
int main(){
int m;
cin>>n>>m;
for(int i=0;i<n;i++){
char ch;
cin>>ch;
a[i].val=ch;
}
for(int i=0;i<m;i++){
char u,v;
cin>>u>>v;
int uu=find(u),vv=find(v);
add(uu,vv);
add(vv,uu);
}
char ch;
cin>>ch;
int k;
if((k=find(ch))!=-1){
dfs(k);
}else{
cout<<"error";
}
return 0;
}
7-2 迪傑斯特拉方法實現最短路徑
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1010;
struct edge{
int v,w;
edge* next;
};
struct node{
int k;
edge* next;
}a[1010];
int n;
int find(int u){
for(int i=0;i<n;i++){
if(a[i].k==u){
return i;
}
}
return -1;
}
void add(int u,int v,int w){
edge* e=new edge();
e->v=v;
e->w=w;
e->next=a[u].next;
a[u].next=e;
}
int dis[N],pre[N];
bool st[N];
void dijkstra(int u){
memset(pre,-1,sizeof pre);
memset(dis,0x3f,sizeof dis);
dis[u]=0;
for(int i=0;i<n-1;i++){
int k=-1;
for(int j=0;j<n;j++){
if(st[j]==0&&(k==-1||dis[j]<dis[k])){
k=j;
}
}
if(dis[k]==0x3f3f3f3f){
continue;
}
st[k]=1;
for(edge* j=a[k].next;j!=NULL;j=j->next){
int v=j->v,w=j->w;
if(dis[v]>dis[k]+w){
dis[v]=dis[k]+w;
pre[v]=k;
}
}
}
}
void showRoad(int v){
if(pre[v]!=-1){
showRoad(pre[v]);
cout<<"-->"<<a[v].k;
}else{
cout<<a[v].k;
}
}
int main(){
int m;
cin>>n>>m;
for(int i=0;i<n;i++){
int k;
cin>>k;
a[i].k=k;
}
for(int i=0;i<m;i++){
int u,v,w;
cin>>u>>v>>w;
int uu=find(u),vv=find(v);
add(uu,vv,w);
}
int u,v;
cin>>u>>v;
dijkstra(u);
showRoad(v);
return 0;
}