这题作为模板题,解法好多...

最近周围的人都在搞图论阿,感觉我好辣鸡,只会跟风学习。

暂时只有SPFA和Dijkstra的

SPFA (邻接表版。也可以写成临接矩阵存图,但题目可能给出平行边的,所以要注意找最小的边储存,还要注意判断一个点是否多次进入队列)老实说觉得SPFA好像只是被队列优化过的ford一样的..

 #include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <utility>
#include <vector>
#include <queue>
#define MAXX 10010
using namespace std; const int N = ;
const int INF = 0x3f3f3f3f; typedef struct sion
{
int dis;
int nxp;
}sion; int dic[N];
bool vis[N];
vector<sion>li[N]; int spfa(int &s, int &t)
{
queue<int>q;
q.push(s);
vis[s] = ;
dic[s] = ;
while(!q.empty())
{
int pre = q.front();
q.pop();
for(int i = ; i < li[pre].size(); i++)
{
// cout << dic[li[pre][i].nxp] << "~";
if(dic[li[pre][i].nxp] > dic[pre] + li[pre][i].dis)
{
dic[li[pre][i].nxp] = dic[pre] + li[pre][i].dis;
q.push(li[pre][i].nxp);
// cout << dic[li[pre][i].nxp] << "!";
}
} }
return dic[t];
} void init()
{
memset(vis,false,sizeof(vis));
memset(dic,INF,sizeof(dic));
for(int i = ; i < N; i++)
li[i].clear();
return ;
} int main()
{
int n, m;
int s, t;
while(cin >> n >> m)
{
init();
sion a;
int x;
for(int i = ; i < m; i++)
{
scanf("%d%d%d",&x, &a.nxp, &a.dis);
li[x].push_back(a);
int temp = a.nxp;
a.nxp = x;
li[temp].push_back(a);
}
scanf("%d%d", &s, &t);
int y = spfa(s, t);
if(y >= INF)
{
printf("-1\n");
}
else printf("%d\n", y);
}
}

Dijkstra(邻接表版。临接矩阵需要注意的同上) 搞了几个小时,最后WA发现原来是原理没搞清orz,每次从一个点out后,需要找的是未被标记的离起点最小的点,而我找的是队列里离上一个点最小的点,这就有问题了。唉,人蠢没得治

 #include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#include <utility>
#include <vector>
#define MAXX 1010
#define MMI(x) memset(x, INF, sizeof(x))
#define MMF(x) memset(x, false, sizeof(x))
using namespace std; const int N = ;
const int INF = 0x3f3f3f3f; typedef struct sion
{
int dis;
int nxp;
}sion; vector<sion> edge[MAXX]; int dic[N];
bool vis[N]; void init()
{
memset(vis,false,sizeof(vis));
memset(dic,INF,sizeof(dic));
for(int i = ; i < MAXX; i++)
{
edge[i].clear();
}
}
void dijkstra(int &s, int &n)
{
queue<int >q;
vis[s] = ;
dic[s] = ;
q.push(s); while(!q.empty())
{
int mi = INF;
int t = q.front();
int x = ;
q.pop();
for(int i = ; i < edge[t].size(); i++)
{
int np = edge[t][i].nxp;
int s = dic[t] + edge[t][i].dis; if(dic[np] > s && !vis[np])
{
dic[np] = s;
}
}
for(int i = ; i < n; i ++)
if(!vis[i] && mi > dic[i])
mi = dic[i], x = i;
if(mi == INF)
break;
q.push(x);
vis[x] = ;
}
} int main()
{
int n, m;
sion a, b;
while(cin >> n >> m)
{
init();
int s, t;
for(int i = ; i < m; i++)
{
scanf("%d%d%d", &t, &a.nxp, &a.dis);
edge[t].push_back(a);
int temp = a.nxp;
a.nxp = t;
edge[temp].push_back(a);
}
scanf("%d%d", &s, &t);
dijkstra(s, n);
if(dic[t] >= INF)
printf("-1\n");
else
printf("%d\n", dic[t]);
}
}

HDU 1874 SPFA/Dijkstra/Floyd的更多相关文章

  1. hdu 1874(Dijkstra + Floyd)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  2. ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  3. HDU 1874 畅通工程续 SPFA || dijkstra||floyd

    http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目大意: 给你一些点,让你求S到T的最短路径. 我只是来练习一下SPFA的 dijkstra+邻接矩阵 ...

  4. hdu3665-Seaside(SPFA,dijkstra,floyd)

    Seaside Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. hdu 1874 畅通工程续(模板题 spfa floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 spfa 模板 #include<iostream> #include<stdio ...

  6. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...

  7. (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。

    floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...

  8. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  9. HDU 1874 畅通工程续【Floyd算法实现】

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. 十一:Centralized Cache Management in HDFS 集中缓存管理

    集中的HDFS缓存管理,该机制可以让用户缓存特定的hdfs路径,这些块缓存在堆外内存中.namenode指导datanode完成这个工作. Centralized cache management i ...

  2. 软件工程 part4 评价3作品 修改

    作品1 抢答器 地址: https://modao.cc/app/ylGTXobcMU7ePNi6tY53gG4iraLl0md评价: 老师有意见,我重新评价,这个作品是我测试最方便的,地址点进去直接 ...

  3. wwnjld第二轮迭代测试报告

    1.引言 1.1测试报告目的 被测试报告为wwnjld小组我们的时间管理软件的第二轮迭代所写的软件测试报告.在经过本小组大家不懈的努力之下,我们小组第二轮迭代的产品终于新鲜出炉了.这次测试小组的主要成 ...

  4. Calculator Part Ⅰ

    GitHub/object-oriented The title of the work 关于这次的作业,一开始我是觉得不难的,毕竟学长在已经提供了足够多的提示,实现步骤.需要那些方面的知识等等.但是 ...

  5. freefcw/hustoj Install Guide

    First of all, this version hustoj is a skin and improved for https://code.google.com/p/hustoj/. So t ...

  6. java — 排序算法

    1.冒泡排序 比较相邻元素,如果第一个比第二个大,就交换位置,每一次交换,当前 package BubbleSort; public class Test { public static void m ...

  7. 3dContactPointAnnotationTool开发日志(十二)

      因为ReferenceImage的锚点是固定的左下角,缩放时controller面板也会跟着动.为了使Scale的时候controller上的slider不会远离指针,于是把controller固 ...

  8. PHPCMS登录后不是进入会员中心而是转入登录前页最新代码

    phpcms比如会员在登录前是停留在下载页面的,但是下载页面是要求会员登录后才能下载,所以会员就有这个登陆过程,但是一般的会员系统是登录进会员中心的,就会有点体验不好  这里教大家修改下 能达到登录后 ...

  9. UML图之协作图

    创建方法: 1,new----collaboration diagram 2,根据序列图按F5转换 增加对象链接(图2-4-4)    (1) 选择Object Link 工具栏按钮. (2) 单击要 ...

  10. POJ1066:Treasure Hunt——题解

    http://poj.org/problem?id=1066 题目大意:给一个由墙围成的正方形,里面有若干墙,每次破墙只能从(当前看到的)墙的中点破,求最少破多少墙才能看到宝藏. —————————— ...