博客園——圖

1.1圖的思惟導圖

圖的存儲結構--圖的遍歷---最小生成樹--最短路徑---拓撲排序、關鍵路徑node

1.2 圖結構學習體會算法

談談你對圖結構中的幾個經典算法學習體會。具體有:數組

深度遍歷算法:函數

1 其規則:從圖的某個初始頂點v出發,首先訪問初始頂點v,而後選擇一個與定點v相鄰且沒有被訪問過的頂點w爲下一個初始頂點,再從w出發進行深度優先遍歷,知道圖中與當前頂點v鄰接的全部頂點都被訪問過爲止。學習

2 採用遞歸的方法通常採用鄰接表爲其算法的存儲結構,由於要判斷頂點是否訪問因此須要設立一個全局數組visited[]來標記。測試

3時間複雜度爲O(n+e)用鄰接矩陣時時間複雜度爲O(n*n)設計

4注意 對於非連通的DFS算法須要改進 經過加一個for()循環使其遍歷全部節點,由於單獨的深度遍歷只能檢索一個連通圖3d

廣度遍歷算法:code

1 其規則:首先訪問初始頂點v,接着訪問頂點v的全部未被訪問過的鄰接點,依次類推,直到圖中全部和初始頂點v有路徑相通的頂點都被訪問過爲止。blog

2 採用循環嵌套方式以鄰接表爲存儲結構,經過一個隊列的出入隊來標記是否訪問過。

3 時間複雜度同深度遍歷

4 注意 其算法相似於樹的層次遍歷,對於非連通圖也須要注意用for來實現屢次檢索

Prim和Kruscal算法:

算法P主要是以頂點爲基礎,經過頂點與頂點之間的最小邊來修改邊集,當新加入頂點出現新的最小邊,局部最優時,修改。的算法K以邊爲基礎,按權值大小從最小的邊選擇起。
Dijkstra算法 :1 從一個頂點到其他各頂點的最短路徑,其精髓就是不斷地對 dist path 數組的值進行修正,在每一次加入新的節點後找出最短路徑

2 對此算法,證實了一點:若是一條路徑是最短路徑,那麼這條路上全部的子路徑都爲最短路徑。

3 與之對應的弗洛伊德算法能夠求出每對頂點之間的最短路徑。
拓撲排序算法
1 與深度遍歷結合能夠檢測是否產生環路

2 在一個有向圖中找到一個拓撲序列的過程(有向無環圖)

2.1 題目1:7-1 圖着色問題(25 分)
圖着色問題是一個著名的NP徹底問題。給定無向圖G=(V,E),問能否用K種顏色爲V中的每個頂點分配一種顏色,使得不會有兩個相鄰頂點具備同一種顏色?

但本題並非要你解決這個着色問題,而是對給定的一種顏色分配,請你判斷這是不是圖着色問題的一個解。

2.2 設計思路(僞代碼或流程圖)
int main(){
定義變量
輸入所須要處理的顏色分配scanf("%d%d%d",&v,&e,&k);
for(int i = 0;i<e;i++){
輸入
對應入棧
}
scanf("%d",&num);
while(num--){
bool flag = true;
清零初始化
for(int i = 1;i <= v;i++){
scanf("%d",&color[i]);
讀入着色
}
if(不符合圖着色對應要求)
flag = false;
for(int i = 1;i <= v;i++){
for(int j = 0;j < mp[i].size();j++){
雙重循環判斷鄰接矩陣存儲模式下的圖顏色
}
}
if(!flag)
break;
}
根據flag值 輸出是否符合條件
}
return 0;
}

2.3 代碼截圖(注意,截圖、截圖、截圖。代碼不要粘貼博客上。不用用···語法去渲染)

2.4 PTA提交列表說明。

經過和同窗討論代碼和借鑑網上的代碼。
一個經過判斷着色數目,若是分配數目和給題目的顏色數目的不相等則返回false

若是相鄰的頂點顏色相同也返回false。 從兩方面判斷

2.1 題目2:7-2 排座位(25 分)
佈置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。不管如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務如今就交給你,對任何一對客人,請編寫程序告訴主人他們是否能被安排同席。

2.2 設計思路(僞代碼或流程圖)
int Find(int arr[],int x)
{
while(x != arr[x])
x = arr[x];
return x ;
}
void join(int a,int b)
{
定義調用find函數
if(x != y)
{
判斷是否相等
}
}
int main()
{
定義變量
輸入
for(int i = 0 ; i < MAX ; i ++)
{
循環賦值
}
for(int i = 0 ; i < M ; i ++)
{
輸入
if(cc == 1)
{
知足條件調用 join
}
else
{
對應賦1
}
}
for(int i = 0 ; i <K ; i ++)
{
scanf("%d%d" , &t1 , &t2);
定義賦值
根據條件判斷是那種類型的座位排列,輸出相應的話語
}
return 0 ;}

2.3 代碼截圖(注意,截圖、截圖、截圖。代碼不要粘貼博客上。不用用···語法去渲染)

2.4 PTA提交列表說明。

一開始的編譯錯誤是覺得沒有切換c環境,後面發現不是這個問題是由於頭文件沒有寫好,由於參考網上代碼因此開始以爲不須要用到某些文件就刪掉了。後來把一些有用到庫函數或者其餘條件的所有改爲c語言再運行發現仍是編譯錯誤,就從新根據原來的再敲過了。


2.1 題目3:7-8 城市間緊急救援(25 分)
做爲一個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些鏈接城市的快速道路。每一個城市的救援隊數量和每一條鏈接兩個城市的快速道路長度都標在地圖上。當其餘城市有緊急求助電話給你的時候,你的任務是帶領你的救援隊儘快趕往事發地,同時,一路上召集儘量多的救援隊。

2.2 設計思路(僞代碼或流程圖)
庫函數調用
定義變量
定義結構體

int cmp(const voida,const voidb) {
根據判斷返回對應值
}
int main() {
定義結點數、邊數、起點、終點
初始化地圖上的結點
for(int i=0; i<N; Map[i++].right=0);

for(int i=0; i<N; scanf("%d",&teams[i++]));

讀入救援隊數量
{
讀入地圖信息,並排序整理

}
    for(int i=0; i<N; i++) {

        qsort(Map[i].Reached,Map[i].right,sizeof(data),cmp);分配
        for(int j=0; j<Map[i].right; j++) {
        }
    }
}

for(int i=0; i<N; Lenth[i++][0]=FULL); 
初始化
Dijkstra(S);調用算法
printf("%d %d\n",Lenth[D][2],Lenth[D][1]);
DFS(D,S);深度遍歷,
printf("%d",D);
return 0;

}

2.3 代碼截圖(注意,截圖、截圖、截圖。代碼不要粘貼博客上。不用用···語法去渲染)



2.4 PTA提交列表說明。

最開始的部分錯誤是由於最後一個if判斷條件寫錯,把規定的0 1 2記錯所測試點只對了一個。

後來的編譯錯誤是修改的時候忘記切換輸入法致使出現中文字符。
3.截圖本週題目集的PTA最後排名(3分)

本次題目集總分:310分

3.1 PTA排名(截圖帶本身名字的排名)

  1. 閱讀代碼(必作,1分)

讀的
這我的的有關於六度空間的代碼

sum++;/當每出一個點,表明這個點是擴散成功的,便可到達的點數加一 ,經過sum累加實現
    for(i = head[u.cen] ; i != -1 ; i = e[i].next) //全部和這個點相鄰的點,都須要被擴散 去找其餘的關係
    {  
        if(vis[e[i].y])  //注意這裏的標記是必需要有判斷的,不然當1-2到達了中心點爲2的node的時候,因爲存儲了2-1,中心點就又會回到1,循環往復致使沒法跳出循環
            continue;  
        vis[e[i].y] = 1;  
        v.cen = e[i].y;  
        v.step = u.step + 1;  
        q.push(v);  
    }  
}  
return sum;

} int main() //主函數 { int i, a, b, j; scanf("%d %d", &n, &m); memset(head, -1, sizeof(head)); for(i = 0 ; i < m ; i++) { scanf("%d %d", &a, &b); e[i].x = a;//注意無向圖鄰接矩陣的創建 e[i].y = b; e[i].next = head[a]; head[a] = i; e[i + m].x = b; e[i + m].y = a; e[i + m].next = head[b]; head[b] = i + m; } float t; for(i = 1 ; i <= n ; i++) { memset(vis, 0, sizeof(vis)); //這個函數是庫函數中用於初始化的函數 t = bfs(i) * 100.0 / n; printf("%d: %.2lf%%\n", i, t); } return 0; }

相關文章
相關標籤/搜索