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 ...
随机推荐
- POJ 2540 Hotter Colder(半平面交)
Description The children's game Hotter Colder is played as follows. Player A leaves the room while p ...
- 【转】jQuery的deferred对象详解
jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...
- POJ 2823 (滑动窗口)
这道题最容易想到的是用朴素的做法,即 每滑动一次,就遍历一次窗口找出最大最小值,这样时间复杂度为O(n*k),由于题目数据比较大,这种做法肯定是超时的. 另外,根据书上的讲解,还可以采用优先队列来求解 ...
- NSTimer使用注意事项
1.scheduled开头和非schedule的开头方法的区别.系统框架提供了几种创建NSTimer的方法,其中以scheduled开头的方法会自动把timer加入当前run loop,到了设定的时间 ...
- LintCode-35.翻转链表
翻转链表 翻转一个链表 样例 给出一个链表 1->2->3->null ,这个翻转后的链表为 3->2->1->null 挑战 在原地一次翻转完成 标签 链表 优步 ...
- PokeCats开发者日志(十四)——终章
已经不知道离PokeCats游戏开始开发有多少个晚上了,今晚心血来潮整理随笔的时候发现这个故事还没有划上句号. 故事的结局是最终我拿到了软著权,但是没办法上架到任何一个知名的安卓app市场,连 ...
- chrome extension demos
chrome extension demos demo https://github.com/hartleybrody/buzzkill/blob/master/bootstrap.js https: ...
- DELPHI BOOKMARK使用
关于书签(BookMark)操作: 书签操作主要用于在表中快速地定位记录指针,在应用程序中常常要保存记录指针所在的位置,在进行其他处理之后,希望能快速地返回到先前指针所在的位置,此时,使用 ...
- 【转载】用C#编写一个简单的记事本
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- BZOJ 1806 矿工配餐(DP)
很水的DP. 因为每一个餐车的加入只需要知道当前矿洞的前两个餐车种类就行了.而餐车一共就三种. 所以令dp[i][Sa][Sb]表示前i辆餐车送餐完毕后第一个矿洞的前两个餐车种类为Sa,第二个矿洞的前 ...