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點;
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;
}