算法設計與分析作業(1)

1.dijkstra求單源最短路徑

先進行存圖操作,將帶權有向圖用鄰接矩陣來表示;

for(int i=0;i<M;i++)  
{  
        cin>>u>>v>>dist;  
        map[u][v]=dist;  
} 
用dis數組來存儲0點到其他每一個點的最短距離,初始時dis[i] = map[0][i];接下來進行鬆弛操作,找出最短距離


首先0點爲q集合中的點,0-1,0-3,0-4中最短的爲0-1,得到0-1之間最小值;


將1點加入q集合,0-3,0-4,1-2,中最短爲0-3,標記3點;


將3點加入q集合,0-4,1-2,3-4,3-2中最短爲3-2,標記2點;

將1點也加入q集合,0-4,1-2,3-4,2-4中最短爲2-4,標記4點;

0點到所有點的最短距離。.

    for(int i = 1; i <= N; i ++)  
    {  
        dis[i] = map[1][i];  
    }  
    dis[0] = 0;  
    v[0] = true;  //初始點集合都爲真
    for(int i = 1; i < N; i ++)  
    {  
        int MIN = INF, pos;  
        for(int j = 0; j < N; j ++)  
        {  
            if(v[j] == false && dis[j] < MIN)  
            {  
                MIN = dis[j];  
                pos = j;  
            }  
        }  
        v[pos] = true;  
        for(int j = 0; j < N; j ++)  
        {  
            if(v[j] == false && dis[j] > dis[pos] + map[pos][j])  //鬆弛 找出最小值
            {  
                dis[j] = dis[pos] + map[pos][j];  
            }  
        }  
    } 

2.最小生成樹prim與kruskal求解過程

prim


kruskal



3.會場安排問題

 

若優先選擇結束時間早的,這樣就可以騰出儘可能多的時間供接下來的活動使用,可行。

所以使用貪心算法,優先選擇結束時間早的活動。

將活動按照結束時間進行從小到大排序。然後用i代表第i個活動,挑選出結束時間儘量早的活動,並且滿足後一個活動的起始時間晚於前一個活動的結束時間,全部找出這些活動就是最大的相容活動子集合。系統檢查活動i是否與當前已選擇的所有活動相容。若相容活動i加入已選擇活動的集合中,否則,不選擇活動i,而繼續下一活動與集合中活動的相容性。若活動i與之相容,則i成爲最近加入集合的活動,並取代活動j的位置。

int ArrangingActivities(int n)  
{  
    //按結束時間從小到大排序  
    sort(act, act+n, cmp);  
  
    int count = 0;  
    int time = -1;  //當前時間  
    int i;  
    for (i = 0; i < n; i++)  
    {  
        if (act[i].start > time)  
        {  
            count++;  
            time = act[i].end;  
        }  
    }  
    return count;  
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章