HDU 2544 dijk优化探索---优先队列优化
2017-07-18 23:36
405 查看
菜
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
dijk 就可以过
优先队列优化一下也不赖,感觉优先队列优化后写法和spfa差不多都是用队列,spfa的STL优化入队方法改变成了直接用优先队列使边小的先出队,个人感觉优先队列不赖,可惜自己还是不太会写优先队列。。。
先放两个写优先队列写法的博客,很不赖,可惜自己还是太菜,没看懂
http://blog.csdn.net/catglory/article/details/45584043
http://www.cnblogs.com/summerRQ/articles/2470130.html
矩阵
那个名字没改,不要太在意。。。。。
邻接表
只学会一种申请方法
opriator < int ,vector,cmp>
int 类型
vector< int> 容器类型,默认vector
cmp 比较方法
有的人说优先队列其实就是一个堆,不知道用堆优化和这个哪个好(呵呵,还不会堆),学习。。。。。。
stl容器真是个好东西,应该学习,另外优先队比较函数可以用自带的
greater是升序排列,后面的大于前面的
less是降序排列,后面的小于前面的
http://blog.csdn.net/u014644714/article/details/68924863
看这个博客里面有
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
dijk 就可以过
优先队列优化一下也不赖,感觉优先队列优化后写法和spfa差不多都是用队列,spfa的STL优化入队方法改变成了直接用优先队列使边小的先出队,个人感觉优先队列不赖,可惜自己还是不太会写优先队列。。。
先放两个写优先队列写法的博客,很不赖,可惜自己还是太菜,没看懂
http://blog.csdn.net/catglory/article/details/45584043
http://www.cnblogs.com/summerRQ/articles/2470130.html
矩阵
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f using namespace std; int heard[10001],vis[10001]; int t,n; int map[10001][10001]; int dis[10001]; struct cmp { bool operator () (int &a,int &b) { return dis[a]>dis[b]; } }; void spfa() { priority_queue<int,vector<int>,cmp>q; dis[1]=0; int vis[10001]={0}; vis[1]=1; q.push(1); while(!q.empty()) { int x=q.top(); vis[x]=0; q.pop(); for(int i=1;i<=t;i++) { if(dis[i]>dis[x]+map[x][i]) { dis[i]=dis[x]+map[x][i]; if(!vis[i]) { q.push(i); vis[i]=1; } } } } printf("%d\n",dis[t]); } int main() { std::ios::sync_with_stdio(false); while(cin>>t>>n,t,n) { for(int i=1;i<=t;i++) { for(int j=1;j<=t;j++) if(i==j) map[i][j]=0; else map[i][j]=INF; } for(int i=0;i<n;i++) { int u,v,a; cin>>u>>v>>a; map[u][v]=a; map[v][u]=a; } memset(dis,INF,sizeof(dis)); spfa(); } }
那个名字没改,不要太在意。。。。。
邻接表
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f using namespace std; int head[10001]; int o; int n,m; int dis[10001]; struct pp { int v,val,next; }ss[20002]; struct cmp { bool operator ()(int a,int b) { return dis[a]>dis[b]; } }; void add(int x,int y,int z) { ss[o].v=y; ss[o].val=z; ss[o].next=head[x]; head[x]=o++; } void dijk() { priority_queue<int,vector<int>,cmp>q; q.push(1); memset(dis,INF,sizeof(dis)); dis[1]=0; int vis[10001]={0}; vis[1]=1; while(!q.empty()) { int w=q.top(); q.pop(); vis[w]=0; for(int i=head[w];i!=-1;i=ss[i].next) { if(dis[ss[i].v]>dis[w]+ss[i].val) { dis[ss[i].v]=dis[w]+ss[i].val; if(!vis[ss[i].v]) { q.push(ss[i].v); vis[ss[i].v]=1; } } } } printf("%d\n",dis ); } int main() { while(scanf("%d%d",&n,&m),n,m) { o=0; memset(head,-1,sizeof(head)); int u,v,va; for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&va); add(u,v,va); add(v,u,va); } dijk(); } return 0; }
只学会一种申请方法
opriator < int ,vector,cmp>
int 类型
vector< int> 容器类型,默认vector
cmp 比较方法
有的人说优先队列其实就是一个堆,不知道用堆优化和这个哪个好(呵呵,还不会堆),学习。。。。。。
stl容器真是个好东西,应该学习,另外优先队比较函数可以用自带的
greater是升序排列,后面的大于前面的
less是降序排列,后面的小于前面的
http://blog.csdn.net/u014644714/article/details/68924863
看这个博客里面有
相关文章推荐
- 最短路&&优先队列优化->HDU2544
- HDU ~ 2544 ~ 最短路 (Dijkstra模板,常规版 and 优先队列优化版)
- HDU 6000 Wash【优先队列优化贪心】【最大值+最小值】
- HDU1102 - Constructing Roads 用优先队列优化Prim最小生成树
- 【HDU 3810】 Magina (01背包,优先队列优化,并查集)
- In Touch (hdu 5361 优先队列的Dij + 并查集优化)
- hdu1874(dijkstra解法优先队列优化)
- hdu 1874 畅通工程续 dijsktra dijkstra+邻接表 优先队列 bellman-ford bellman-ford队列优化(基础题目,一步步优化)
- hdu 1535 Invitation Cards(逆向构图+Dijkstra优先队列优化)
- hdu(2544)——最短路(邻接表+bellman-ford使用队列优化)
- hdu 2066最短路 dijkstra 及其优先队列优化
- hdu 1874 畅通工程续 (Dijkstra + 优先队列优化)
- hdu-2544-最短路(Dijkstra + Dijkstra优先队列 + Bellman-ford + SPFA +Floyd) 纯模板题
- HDU 1285 确定比赛名次(拓扑排序&amp;&amp;优先队列优化)
- hdu 2824 Dogs(BFS, 优先队列优化)
- HDU 2544 用优先队列写的最短路径
- hdu 2544 最短路(优先队列 迪杰斯特拉Dijkstr)
- hdu 2112 HDU Today 优先队列优化的Dijkstra+map
- hdu 2680 dijkstra 使用优先队列优化
- HDU 2066 dijsktra + 优先队列优化