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