离散数学实验题目-图
目錄
第一章 實驗概述 3
1.1 實驗目的 3
1.2 實驗內容 3
1.3 實驗環境 3
第二章 實驗原理和實現過程 4
2.1 實驗原理 4
2.2 實驗過程(算法描述) 4
2.2.1 程序整體思路 4
2.2.2具體算法流程 4
第三章 實驗數據及結果分析 6
第四章 實驗收獲和心得體會 6
4.1 實驗收獲 6
4.2 心得體會 6
第五章 實驗源程序清單 8
5.1 程序代碼 7
第一章 實驗概述
1.1 實驗目的
理解圖論的基本概念,圖的矩陣表示,圖的連通性,圖的遍歷,以及求圖的連通支方法。
通過實驗,幫助學生更好地掌握計算機科學技術常用的離散數學中的概念、性質和運算,培養邏輯思維;通過實驗提高學生編寫實驗報告、總結實驗結果的能力,提高理論聯系實際的能力;使學生具備程序設計的思想,能夠獨立完成簡單的算法設計和分析。通過實驗報告的編寫,掌握目錄、頁碼等文檔編輯技巧。
1.2 實驗內容
以偶對的形式輸入一個無向簡單圖的邊,建立該圖的鄰接矩陣,判斷圖(考慮有向圖和無向圖):
(1)圖是否連通;
(2)計算結點兩兩之間長度為m的路徑數目;
(3)對不連通的圖輸出其各個連通支。
基本要求:程序需具有基本的容錯控制,在輸入錯誤時有處理手段;程序界面友好,需要輸入的地方有輸入說明,說明輸入的內容和格式要求等;實驗原理和實現過程應該詳細分析問題,給出解決思路,描述算法思想,不能用源程序代替算法;測試數據應全面,包括非法輸入的處理結果等都應包含在內;程序代碼關鍵部分要加注釋。實驗報告文檔要求有目錄格式,封面不編頁碼,目錄和正文單獨編頁碼。
1.3 實驗環境
C或C++語言編程環境實現。
第二章 實驗原理和實現過程
2.1 實驗原理
圖論、鄰接矩陣、Floyd算法、深度優先算法、矩陣乘積
2.2 實驗過程(算法描述)
2.2.1 程序整體思路
矩陣乘積判斷圖是否連通;
Floyd算法計算結點兩兩之間長度為m的路徑數目;
Floyd算法,用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的路徑。
從任意節點i到任意節點j的路徑不外乎2種可能,1是直接從i到j,2是從i經過若干個節點k到j。
深度優先算法搜索對不連通的圖輸出其各個連通支
2.2.2具體算法流程
矩陣乘積:
一個m行n列的矩陣與一個n行p列的矩陣可以相乘,得到的結果是一個m行p列的矩陣,其中的第i行第j列位置上的數為第一個矩陣第i行上的n個數與第二個矩陣第j列上的n個數對應相乘后所得的n個乘積之和。
Floyd算法:
深度優先算法:
第三章 實驗數據及結果分析
第四章 實驗收獲和心得體會
1、更好地理解掌握計算機科學技術常用的離散數學中的關系的概念、性質和運算,培養邏輯思維;
2、通過實驗提高編寫實驗報告、總結實驗結果的能力,提高理論聯系實際的能力;
3、具備程序設計的思想,能夠獨立完成簡單的算法設計和分析;
4、通過實驗提高了報告的編寫,掌握目錄、頁碼等文檔編輯技巧;
5、學會用計算機編程語言解決離散數學問題;
6、具有基本的程序調試能力;
7、學會分析問題,給出解決思路,描述算法思想;
8、理解圖論的基本概念,圖的矩陣表示,圖的連通性,圖的遍歷,以及求圖的連通支方法;
9、學會Floyd算法、深度優先算法、矩陣乘積;
10、熟悉關系的閉包運算,編程實現關系閉包運算算法。
11、熟悉圖的矩陣表示方法——鄰接矩陣、可達矩陣和關聯矩陣。
第五章 實驗源程序清單
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> using namespace std; bool check(int a[100][100],int n){int b[100][100];memcpy(b,a,sizeof(b));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)b[i][j]=b[i][j]||(b[i][k]&&b[k][j]);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(!b[i][j])return 0;return 1; } long long cntm(int a[100][100],int n,int m){int b[100][100],c[100][100],d[100][100];memcpy(b,a,sizeof(b));for(int i=1;i<=n;i++)c[i][i]=1;while(m--){memset(d,0,sizeof(d));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)d[i][j]+=c[i][k]*b[k][j];memcpy(c,d,sizeof(c));}long long res=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)res+=c[i][j];return res; } int vis[100]; void dfs(int a[100][100],int u,int c,int n){vis[u]=c;for(int i=1;i<=n;i++){if(!vis[i]&&a[u][i])dfs(a,i,c,n);} } int main() {int n,m;int a[100][100];int b[100][100];cout<<"請輸入邊數:"<<endl;cin>>n;cout<<"請輸入邊:"<<endl;int u,v;int N=0;for(int i=1;i<=n;i++){scanf("%d%d",&u,&v);a[u][v]++;b[u][v]++;b[v][u]++;N=max(N,max(u,v));}//輸出鄰接矩陣cout<<"有向圖:"<<endl;for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)printf("%d%c",a[i][j]," \n"[j==N]);cout<<"無向圖:"<<endl;for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)printf("%d%c",b[i][j]," \n"[j==N]);//判斷連通性cout<<"圖連通性:"<<(check(b,N)?"YES":"NO")<<endl;cout<<"請輸入結點兩兩之間長度:"<<endl;cin>>m;cout<<"有向圖結點兩兩之間長度為"<<m<<"的數量:"<<cntm(a,N,m)<<endl;cout<<"無向圖結點兩兩之間長度為"<<m<<"的數量:"<<cntm(b,N,m)<<endl;memset(vis,0,sizeof(vis));cout<<"圖的連通分支:"<<endl;int cnt=0;for(int i=1;i<=N;i++)if(!vis[i])dfs(b,i,++cnt,N);for(int i=1;i<=cnt;i++){cout<<"Case "<<i<<": ";for(int j=1;j<=N;j++){if(vis[j]==i)cout<<j<<" ";}cout<<endl;}//cout << "Hello world!" << endl;return 0; }總結
以上是生活随笔為你收集整理的离散数学实验题目-图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [POI2002][HAOI2007]反
- 下一篇: From Hero to Zero