poj2387 Til the Cows Come Home(邻接矩阵,邻接表)
2015-08-08 12:13
316 查看
最基础的最短路问题模板题,(我用的dijkstra算法)非常适合我学习使用如何用邻接表存图(之前都是邻接矩阵),太弱了,暑假过一半,现在才刚窥初仪,不过话说邻接表在边比较少的情况下真的很节省空间。
邻接矩阵
对于邻接矩阵,这题有重边,加一个判重,存重边中短的。
Memory: 4480 KB Time: 63 MS
邻接表(用数组模拟)
对于邻接表,写法稍与邻接矩阵不同,这里dist初始化并不是存起始点到各个边的距离,而是都初始化无穷大。然后这里最初是先用起始点松弛(其实是找离起始点最短的边,有重边也没关系),再找最短边加入,再用这个最短边到达的点去松弛其他边。所以这里松弛的作用,起到去重边也能把最短边入dist数组。(我的理解,有误可以交流)
Memory: 476 KB Time: 32 MS
邻接矩阵
对于邻接矩阵,这题有重边,加一个判重,存重边中短的。
Memory: 4480 KB Time: 63 MS
[code]#include<cstdio> #include<cstring> #define inf 1<<29 using namespace std; int M[1050][1050],T,N,dist[1050]; bool visit[1050]; void dijkstra() { memset(visit,false,sizeof(visit)); for(int i=1;i<=N;i++) dist[i]=M[1][i]; visit[1]=true; for(int i=2;i<=N;i++) { int Min=inf,index; for(int j=1;j<=N;j++) { if(visit[j]==false&&dist[j]<Min) { index=j; Min=dist[j]; } } visit[index]=true; for(int j=1;j<=N;j++) { if(visit[j]==false&&dist[j]>dist[index]+M[index][j]) dist[j]=dist[index]+M[index][j]; } } } int main() { while(~scanf("%d %d",&T,&N)) { for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) if(i==j) M[i][j]=0; else M[i][j]=inf; for(int i=1;i<=T;i++) { int a,b,c; scanf("%d %d %d",&a,&b,&c); if(M[a][b]>c) M[a][b]=M[b][a]=c; } dijkstra(); printf("%d\n",dist ); } }
邻接表(用数组模拟)
对于邻接表,写法稍与邻接矩阵不同,这里dist初始化并不是存起始点到各个边的距离,而是都初始化无穷大。然后这里最初是先用起始点松弛(其实是找离起始点最短的边,有重边也没关系),再找最短边加入,再用这个最短边到达的点去松弛其他边。所以这里松弛的作用,起到去重边也能把最短边入dist数组。(我的理解,有误可以交流)
Memory: 476 KB Time: 32 MS
[code]#include<cstdio> #include<cstring> #include<algorithm> #define inf 1<<29 using namespace std; const int maxn=4050; int u[maxn],v[maxn],w[maxn],first[maxn],next[maxn],T,N,dist[maxn]; bool visit[maxn]; void dijkstra() { memset(visit,false,sizeof(visit)); for(int i=1;i<=N;i++) dist[i]=inf; dist[1]=0; visit[1]=true; int Min,index=1; for(int i=2;i<=N;i++) { for(int j=first[index];j!=-1;j=next[j]) { if(visit[v[j]]==false&&dist[index]+w[j]<dist[v[j]]) dist[v[j]]=dist[index]+w[j]; } Min=inf; for(int j=1;j<=N;j++) { if(visit[j]==false&&dist[j]<Min) { index=j; Min=dist[j]; } } visit[index]=true; } } int main() { while(~scanf("%d %d",&T,&N)) { memset(first,-1,sizeof(first)); memset(next,-1,sizeof(next)); for(int i=1;i<=T*2;i+=2) { int a,b,c; scanf("%d %d %d",&a,&b,&c); u[i]=v[i+1]=a,v[i]=u[i+1]=b,w[i]=w[i+1]=c;//无向边,双向存。 next[i]=first[u[i]],next[i+1]=first[u[i+1]]; first[u[i]]=i,first[u[i+1]]=i+1; } dijkstra(); printf("%d\n",dist ); } }
相关文章推荐
- 小根堆+Kruskal算法
- 对SVM的认识
- Thread01:互斥
- 【DOM操作】实时监听input[type='text']和HTML标签中属性改变事件
- Maven 学习笔记(基本概念)
- Defining a controller with @Controller
- AngularJs学习笔记__4、自定义指令
- 设计-简约而不简单
- ASP.NET中Cookie的用法实例分析
- linux上传下载(scp篇)
- [笔记][Java7并发编程实战手册]2.2使用syncronized实现同步方法
- 配置struts2不当错误
- FZU 2196 Escape(BFS预处理+BFS搜索)
- 机房收费系统颗粒大归仓之----MSFlexGrid控件
- iOS UIView控件的常用属性和方法的总结
- ADT SVN 插件安装教程
- activity切换动画总结
- 使用Google Analytics跟踪捕获JavaScript,AngularJS,jQuery的在线错误和异常
- 简单的Linux 驱动模块编译,加载过程
- 如何编译一个linux下的驱动模块(1)