1. 程式人生 > 其它 >演算法與資料結構實驗四

演算法與資料結構實驗四

實驗專案名稱:實驗       

一、 實驗目的

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;

}