HDU 1874 SPFA/Dijkstra/Floyd
这题作为模板题,解法好多...
最近周围的人都在搞图论阿,感觉我好辣鸡,只会跟风学习。
暂时只有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的更多相关文章
- hdu 1874(Dijkstra + Floyd)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Me ...
- ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- HDU 1874 畅通工程续 SPFA || dijkstra||floyd
http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目大意: 给你一些点,让你求S到T的最短路径. 我只是来练习一下SPFA的 dijkstra+邻接矩阵 ...
- hdu3665-Seaside(SPFA,dijkstra,floyd)
Seaside Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 1874 畅通工程续(模板题 spfa floyd)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 spfa 模板 #include<iostream> #include<stdio ...
- hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...
- (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。
floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- HDU 1874 畅通工程续【Floyd算法实现】
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- ptrdiff_t类型
一.特性 1. 这是一种标准库类型 2. 是两个指针相减的结果的类型(因为差值可能为负值,所以是一种带符号类型) 3. 和size_t一样,ptrdiff_t也是一种定义在<cstddef> ...
- java知乎爬虫
好久没写博客了,前阵子项目忙着上线,现在有点空闲,就把最近写的一个爬虫和大家分享下,统计结果放在了自己买的阿里云服务器上(点此查看效果),效果如下: 程序是在工作之余写的,用了java 的webmgi ...
- ajax 返回值问题
错误示例:function returnFlag(){ $.ajax({ type:"post", dataType:"json", data:JSON.str ...
- 常用排序算法--java版
package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...
- C/S结构 B/S结构
[1]C/S 结构,即大家熟知的客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销.目前大多数应 ...
- MATLAB strcmp
比较两个输入字符串是否相等 c = strcmp(str1,str2)比较字符串 str1 与 str2 ,若完全相等则返回 1 ,不相等返回 0 str1 = 'hello'; str2 = 'he ...
- RT-thread内核之消息队列
一.消息队列控制块:在include/rtdef.h中 #ifdef RT_USING_MESSAGEQUEUE /** * message queue structure */ struct rt_ ...
- bzoj4555-求和
题目 \(S(i,j)\)表示第二类斯特林数,求: \[ f(n)=\sum _{i=0}^n\sum _{j=0}^iS(i,j)*2^j*j! \] 分析 公式推理很简单,关键是用到了第二类斯特林 ...
- Andorid API Package ---> android.accessibilityservice
包名: android.accessibilityservice Added in API level 4 URL:http://developer.andro ...
- chrome源码之恢复上次打开的标签页的学习
startup_browser_creator_impl.cc ————————>打开任何页面或浏览器的入口函数bool StartupBrowserCreatorImpl::ProcessSt ...