HDU 2544(floyd+bellman-ford+floyd+dijkstra队列优化)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

题目大意:找点1到点n的最短路(无向图)

练一下最短路。。。

dijkstra+队列优化:

 1 #include<iostream>
 2 #include<functional>
 3 #include<vector>
 4 #include<queue>
 5 using namespace std;
 6 typedef pair<int, int> p;//first是最短距离,second是顶点编号
 7 const int N = 105;
 8 const int INF = 1 << 29;
 9
10 struct edge {
11     int to, cost;//邻接的点,以及到该点的权值
12 };
13
14 vector<edge>eg[N];//邻接表
15 bool used[N];//表示是否已被使用过
16 int d[N];//最短距离
17 int V, E;//顶点数和边数
18
19 void dijistra(int s) {
20     //优先队列,按first从小到大顺序
21     priority_queue<p, vector<p>, greater<p> >q;
22     //初始化
23     for (int i = 1; i <= V; i++) {
24         d[i] = INF;
25         used[i] = false;
26     }
27     d[s] = 0;
28
29     q.push(p(0, s));
30     while (!q.empty()) {
31         p p1 = q.top();
32         q.pop();
33         int v = p1.second;
34         if (used[v])    continue;
35         used[v] = true;
36         for (int i = 0; i<eg[v].size(); i++) {
37             edge e = eg[v][i];
38             if (d[e.to]>d[v] + e.cost) {
39                 d[e.to] = d[v] + e.cost;
40                 q.push(p(d[e.to], e.to));
41             }
42         }
43     }
44 }
45
46 int main() {
47     while (cin >> V >> E && (V || E)) {
48         for(int i=1;i<=V;i++){
49             eg[i].clear();
50         }
51         for (int i = 1; i <= E; i++) {
52             int a, b, cost;
53             cin >> a >> b >> cost;
54             edge g1, g2;
55             g1.to = b, g2.to = a;
56             g1.cost = g2.cost = cost;
57             eg[a].push_back(g1);
58             eg[b].push_back(g2);
59         }
60         dijistra(1);
61         cout << d[V] << endl;
62     }
63 }

bellman-ford:

 1 /*
 2 bellman-ford
 3 */
 4 #include<iostream>
 5 #include<cstring>
 6 using namespace std;
 7 const int N=100005;
 8 const int INF=1<<30;
 9
10 struct edge{
11     int from,to,cost;
12 }es[N];//边
13
14 int d[N];//出发点到i的最短距离
15 int V,E;//顶点数、边数
16
17 //求解从顶点s出发到所有点的最短距离
18 void shortest_path(int s){
19     for(int i=1;i<=V;i++) d[i]=INF;
20     d[s]=0;
21     while(true){
22         bool update=false;
23         for(int i=1;i<=E;i++){
24             edge e=es[i];
25             if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost){
26                 d[e.to]=d[e.from]+e.cost;
27                 update=true;
28             }
29             //双向
30             if(d[e.to]!=INF&&d[e.from]>d[e.to]+e.cost){
31                 d[e.from]=d[e.to]+e.cost;
32                 update=true;
33             }
34
35         }
36         if(!update) break;
37     }
38 }
39
40 int main(){
41     int n,m;
42     while(cin>>V>>E&&(V||E)){
43         for(int i=1;i<=E;i++){
44             cin>>es[i].from>>es[i].to>>es[i].cost;
45         }
46         shortest_path(1);
47         cout<<d[V]<<endl;
48     }
49 }

floyd:

 1 /*floyd*/
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=105;
 6 const int INF=1<<29;
 7 int map[N][N];//map[i][j]表示边i~j的距离
 8
 9 int V,E;//顶点数,边数
10
11 void floyd(){
12     for(int k=1;k<=V;k++)
13         for(int i=1;i<=V;i++)
14             for(int j=1;j<=V;j++)
15                 map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
16 }
17
18 int main(){
19     while(cin>>V>>E&&(V||E)){
20         for(int i=1;i<=V;i++){
21             for(int j=1;j<=V;j++){
22                 if(i==j)
23                     map[i][j]=0;
24                 else
25                     map[i][j]=INF;
26             }
27         }
28         for(int i=1;i<=E;i++){
29             int a,b,cost;
30             cin>>a>>b>>cost;
31             map[a][b]=map[b][a]=cost;
32         }
33         floyd();
34         cout<<map[1][V]<<endl;
35     }
36 }

spfa:

 1 /*spfa*/
 2 #include<iostream>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=105;
 7 const int INF=1<<29;
 8
 9 int map[N][N];
10 int d[N];//距离起点最小距离
11 bool used[N];//点是否在队列中
12 int V,E;//顶点数,边数
13
14 //求解从顶点s出发到所有点的最短距离
15 void spfa(int s){
16     //初始化
17     for(int i=1;i<=V;i++){
18         d[i]=INF;
19         used[i]=false;
20     }
21     d[s]=0;
22
23     queue<int>q;
24     q.push(s);
25     used[s]=true;
26     while(!q.empty()){
27         int k=q.front();
28         q.pop();
29         used[k]=false;
30         //此处实际上可以不用遍历所有点,能够用邻接表优化
31         for(int i=1;i<=V;i++){
32             if(d[i]>d[k]+map[k][i]){
33                 d[i]=d[k]+map[k][i];
34                 //这个点更新后要入队,要判断是否已经在队列中
35                 if(!used[i]){
36                     q.push(i);
37                     used[i]=true;
38                 }
39             }
40         }
41     }
42 }
43
44 int main(){
45     while(cin>>V>>E&&(V||E)){
46         //初始化
47         for(int i=1;i<=V;i++)
48             for(int j=1;j<=V;j++)
49                 map[i][j]=(i==j?0:INF);
50
51         for(int i=1;i<=E;i++){
52             int a,b,cost;
53             cin>>a>>b>>cost;
54             map[a][b]=map[b][a]=cost;
55         }
56         spfa(1);
57         cout<<d[V]<<endl;
58     }
59 }
60  
时间: 2024-10-12 18:00:02

HDU 2544(floyd+bellman-ford+floyd+dijkstra队列优化)的相关文章

HDU 4122 Alice&#39;s mooncake shop 单调队列优化dp

Alice's mooncake shop Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4122 Description The Mid-Autumn Festival, also known as the Moon Festival or Zhongqiu Festival is a popular harvest festival celebrated by Ch

HDU 2544 最短路(Floyd算法)

分析:最短路模板题,没有相关的路径求解 1 #include"iostream" 2 #define INF 65535 3 using namespace std; 4 const int maxn=100+10; 5 int w[maxn][maxn],d[maxn][maxn],n,m; 6 void Floyd() 7 { 8 for(int i=1;i<=n;i++) 9 for(int j=1;j<=n;j++) 10 d[i][j]=w[i][j]; 11 f

hdu 2544 最短路 题解 (dijkstra/迪杰斯特拉算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 这道题用dijkstra模板一套就出来了. 模板:http://blog.csdn.net/xdz78/article/details/47719849 需要注意的是,这里的边应该是双向边,所以在输入边的数据的时候应该这样写: for(i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); g.map[a][b]=g.map[b]

HDU 2680 Choose the best route(dijkstra+优先队列优化)

Choose the best route Problem Description One day , Kiki wants to visit one of her friends. As she is liable to carsickness , she wants to arrive at her friend’s home as soon as possible . Now give you a map of the city’s traffic route, and the stati

HDU 4374 One hundred layer(单调队列优化dp)

题意:有一个n*m的矩阵,每格有一个分数,一个人站在(1,x)位置,在每一行中,他只能朝一个方向走(向左或向右),且最多走t步,问走到最后第n行得到的最大分数. 思路:不难想到状态转移方程dp[i][j] = max(dp[i-1][k]+sum[i][j]-sum[i][k-1]),(k<j) 移项得 dp[i][j]-sum[i][j] = max(dp[i-1][k] - sum[i][k-1]); 方程右侧与i,j无关,所以可以用单调队列维护max(dp[i-1][k] - sum[i]

hdu 3415 Max Sum of Max-K-sub-sequence 单调队列优化DP

题目链接: https://www.cnblogs.com/Draymonder/p/9536681.html 同上一篇文章,只是 需要记录最大值的开始和结束的位置 #include <iostream> #include <string.h> #include <cmath> using namespace std; const int N = 1e5 + 10; int n,k; int s[N<<1],sum[N<<1]; int Q[N&

HDU 2544:最短路( 最短路径入门 &amp;&amp;Dijkstra &amp;&amp; floyd )

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 30972    Accepted Submission(s): 13345 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

hdu 2544 最短路 (dijkstra,floyd)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目大意:找到两点间最短的距离值. 代码一:(dijkstra算法) 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int n,Min,node[105],visit[105],map[105][105]; 5 void set() 6 { 7 for (int i=1; i<=n; i

HDU - 2544 - 最短路 (最基础单源最短路问题!!dijkstra+floyd+SPFA)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 34617    Accepted Submission(s): 15001 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找