hdu 2544 最短路(水题,dijkstra)
2014-04-22 15:45
435 查看
小记:本想用dp来做,但是不晓得如何处理环,于是改用dijkstra了。 如果想看邻接表解决的可以参看我的这篇
《spfa+邻接表》
小记:裸dijkstra就可以过
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8
const int MAX_ = 110;
const int N = 100010;
const int INF = 0x7fffffff;
int dp[MAX_], mp[MAX_][MAX_];
bool vis[MAX_];
int n, m;
void dijkstra(int start)
{
for(int i = 1; i <= n; ++i){
dp[i] = INF;
vis[i] = 0;
}
queue<int >q;
q.push(start);
dp[start] = 0;
for(int i = 0; i < n; ++i){
int k, mmin = INF;
for(int j = 1; j <= n; ++j){
if(!vis[j] && dp[j] < mmin){
mmin = dp[j];
k = j;
}
}
vis[k ] = 1;
for(int j = 1; j <= n; ++j){
if(!vis[j] && mp[k][j] && dp[j] > dp[k] + mp[k][j]){
dp[j] = dp[k] + mp[k][j];
}
}
}
}
int main(){
int s, t, v;
while(scanf("%d%d",&n,&m),n||m){
mst(mp,0);
for(int i = 0; i < m; ++i){
scanf("%d%d%d",&s,&t,&v);
mp[s][t] = mp[t][s] = v;
}
dijkstra(1);
printf("%d\n",dp
);
}
return 0;
}
《spfa+邻接表》
小记:裸dijkstra就可以过
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8
const int MAX_ = 110;
const int N = 100010;
const int INF = 0x7fffffff;
int dp[MAX_], mp[MAX_][MAX_];
bool vis[MAX_];
int n, m;
void dijkstra(int start)
{
for(int i = 1; i <= n; ++i){
dp[i] = INF;
vis[i] = 0;
}
queue<int >q;
q.push(start);
dp[start] = 0;
for(int i = 0; i < n; ++i){
int k, mmin = INF;
for(int j = 1; j <= n; ++j){
if(!vis[j] && dp[j] < mmin){
mmin = dp[j];
k = j;
}
}
vis[k ] = 1;
for(int j = 1; j <= n; ++j){
if(!vis[j] && mp[k][j] && dp[j] > dp[k] + mp[k][j]){
dp[j] = dp[k] + mp[k][j];
}
}
}
}
int main(){
int s, t, v;
while(scanf("%d%d",&n,&m),n||m){
mst(mp,0);
for(int i = 0; i < m; ++i){
scanf("%d%d%d",&s,&t,&v);
mp[s][t] = mp[t][s] = v;
}
dijkstra(1);
printf("%d\n",dp
);
}
return 0;
}
相关文章推荐
- HDU - 2544 最短路(Dijkstra)
- HDU ~ 2544 ~ 最短路 (Dijkstra模板,常规版 and 优先队列优化版)
- Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法汇总 HDU 2544为例
- hdu 2544 最短路 Dijkstra
- hdu 2544 最短路 (dijkstra)
- hdu 2544 【总结】 Dijkstra,Bellman-Ford ,SPFA 最短路求法及对应优化
- HDu 2544 最短路【dijkstra & floyed & SPFA 】
- HDU 2544 最短路(Dijkstra)
- 【图论--Dijkstra】HDU 2544 最短路
- hdu 2544 最短路(Dijkstra 备忘)
- 最短路 Dijkstra HDU-2544
- HDU 2544最短路dijkstra模板题
- HDU 2544 最短路 Dijkstra 算法、 Floyd 算法 Bellman_ford算法
- HDU 2544 最短路(dijkstra)
- hdu 2544 【总结】 Dijkstra,Bellman-Ford ,SPFA 最短路求法及对应优化
- HDU 2544 最短路 (最短路 Dijkstra)
- [dijkstra/SPFA/floyd]HDU 2544最短路
- HDU 2544 最短路(单源最短路 dijkstra / floyd / dijkstra(堆优化)/dijkstra+邻接链表+堆优化)
- hdu 2544 最短路 图论-求两点之间的最短距离 Dijkstra
- hdu-2544-最短路(Dijkstra + Dijkstra优先队列 + Bellman-ford + SPFA +Floyd) 纯模板题