Acm学习总结21

Acm学习总结21
图论分析:
图的遍历:1.深度优先遍历,这个遍历跟dfs差不多相似之处,从一点出发访问与之相连的其他点如果访问过了之后需要标记一下这个点再去访问其他的点;
具体代码实现:
下面给出的深度优先遍历的参考程序,假设图以邻接表存储
 void dfs(int i) //图用数组模拟邻接表存储,访问点i
 {
   visited[i] = true; //标记为已经访问过
   for (int j = 1; j <= num[i]; j++) //遍历与i相关联的所有未访问过的顶点
   if (!visited[g[i][j]])
   dfs(g[i][j]);
 }
主程序如下:
 int main()
 {
……
memset(visited,false,sizeof(visited));
for (int i = 1; i <= n; i++) //每一个点都作为起点尝试访问,因为不是从任何
//一点开始都能遍历整个图的,例如下面的两个图。
if (!visited[i])
dfs(i);
……
return 0;
 }
2.广度优先搜索,这种操作一般不大使用,所以也就不过多的介绍了。
还有就是佛洛依德算法:
for (k = 1; k <= n; k++) //floyed 最短路算法
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if ((i != j) && (i != k) && (j != k) && (f[i][k]+f[k][j] < f[i][j]))
f[i][j] = f[i][k] + f[k][j];
具体的代码实现;
这种方法比较好理解但是十分的耗费时间,所以这种方法只适用于比较小的数据;
Dijkstra算法这种算法就类似于贪心算法
1.在没有被访问过的点中找一个顶点u使得dis[u]是最小的。
2.u标记为已确定最短路径
3.For 与u相连的每个未确定最短路径的顶点v
if (dis[u]+w[u][v] < dis[v]) //找到未访问的点然后选择最优的点
{
dis[v] = dis[u] + w[u][v];
pre[v] = u;
}
本次的总结也就这些了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值