hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)
题目链接
畅通工程,可以用dijkstra算法实现。
听说spfa很好用,来水一发
邻接矩阵实现:
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <utility>
#include <vector>
#define mem(arr, num) memset(arr, 0, sizeof(arr))
#define _for(i, a, b) for (int i = a; i <= b; i++)
#define __for(i, a, b) for (int i = a; i >= b; i--)
#define IO \
ios::sync_with_stdio(false); \
cin.tie(); \
cout.tie();
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f;
;
const ll mod = 1000000007LL;
+ ;
int mp[N][N], mp1[N][N];
int dis[N], vis[N];
int V, E;
void spfa(int start) {
; i <= V; i++) dis[i] = inf;
dis[start] = ;
vis[start] = ;
queue<int> q;
q.push(start);
while (!q.empty()) {
int v = q.front();
q.pop();
vis[v] = ;
; i <= mp1[v][]; i++) {
if (dis[mp1[v][i]] > dis[v] + mp[v][mp1[v][i]]) {
dis[mp1[v][i]] = dis[v] + mp[v][mp1[v][i]];
) q.push(mp1[v][i]), vis[mp1[v][i]] = ;
}
}
}
}
int main() {
int s, e, value;
while (cin >> V >> E) {
mem(mp,); mem(mp1,); mem(vis,);
_for(i, , E) {
cin >> s >> e >> value;
&& mp[s][e] < value) continue;
mp1[s][]++;
mp1[s][mp1[s][]] = e;
mp[s][e] = value; //记录mp度并且记录每个度的点的下标。
mp1[e][]++;
mp1[e][mp1[e][]] = s;
mp[e][s] = value;
}
int start, _end;
cin >> start >> _end;
spfa(start);
if (dis[_end] < inf)
cout << dis[_end] << endl;
else
cout << "-1" << endl;
}
;
}
邻接表实现:
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <utility>
#include <vector>
#define mem(arr, num) memset(arr, 0, sizeof(arr))
#define _for(i, a, b) for (int i = a; i <= b; i++)
#define __for(i, a, b) for (int i = a; i >= b; i--)
#define IO \
ios::sync_with_stdio(false); \
cin.tie(); \
cout.tie();
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f;
;
const ll mod = 1000000007LL;
+ ;
<< ;
int mp[N][N], mp1[N][N];
int dis[N], vis[N];
int V, E;
int first[N];
;
struct edge {
int point, next, value;
} e[MAXN];
void add(int u, int v, int w) {
e[num].point = v;
e[num].next = first[u];
e[num].value = w;
first[u] = num++;
}
void spfa(int start) {
; i <= V; i++) dis[i] = inf;
dis[start] = ;
vis[start] = ;
queue<int> q;
q.push(start);
while (!q.empty()) {
int v = q.front();
q.pop();
vis[v] = ;
; tmp = e[tmp].next) {
if (dis[e[tmp].point] > dis[v] + e[tmp].value) {
dis[e[tmp].point] = dis[v] + e[tmp].value;
, q.push(e[tmp].point);
}
}
}
}
int main() {
int s, e, value;
while (cin >> V >> E) {
num = ;
mem(vis, );
int u, v, w;
_for(i, , V) { first[i] = -; }
_for(i, , E) {
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
int start, _end;
cin >> start >> _end;
spfa(start);
if (dis[_end] < inf)
cout << dis[_end] << endl;
else
cout << "-1" << endl;
}
;
}
vector存储:
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <utility>
#include <vector>
#define mem(arr, num) memset(arr, 0, sizeof(arr))
#define _for(i, a, b) for (int i = a; i <= b; i++)
#define __for(i, a, b) for (int i = a; i >= b; i--)
#define IO \
ios::sync_with_stdio(false); \
cin.tie(); \
cout.tie();
using namespace std;
typedef long long ll;
const ll INFL = 0x3f3f3f3f3f3f3f3f;
const int INF = 0x3f3f3f3f;
;
const ll mod = 1000000007LL;
+ ;
<< ;
int dis[N], vis[N];
int V, E;
;
struct edge{
int point, value;
edge() {}
edge(int _p,int _v) {point = _p, value = _v;}
};
vector <edge> e[N];
void spfa(int st) {
; i <= V; i++) dis[i] = INF;
dis[st] = ;
vis[st] = ;
queue<int> q;
q.push(st);
while (!q.empty()) {
int v = q.front();
q.pop();
vis[v] = ;
vector <edge> :: iterator itor = e[v].begin();
for( ; itor != e[v].end(); itor++) {
if(dis[(*itor).point] > dis[v] + (*itor).value) {
dis[(*itor).point] = dis[v] + (*itor).value;
, q.push((*itor).point);
}
}
/*for(int i = 0; i < e[v].size(); i++) {
if(dis[e[v][i].point] > dis[v] + e[v][i].value) {
dis[e[v][i].point] = dis[v] + e[v][i].value;
if(!vis[e[v][i].point]) vis[e[v][i].point] = 1, q.push(e[v][i].point);
}
}*/
}
}
int main() {
while (~scanf("%d%d",&V,&E)) {
num = ;
mem(vis, );
int u, v, w;
_for(i, , V) { e[i].clear(); }
_for(i, , E) {
scanf("%d%d%d",&u,&v,&w);
e[u].push_back(edge(v,w));
e[v].push_back(edge(u,w));
}
int st, ed;
cin >> st >> ed;
spfa(st);
if (dis[ed] < INF)
cout << dis[ed] << endl;
else
cout << "-1" << endl;
}
;
}
hdu 1874 畅通工程(spfa 邻接矩阵 邻接表)的更多相关文章
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- hdu 1874 畅通工程续
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...
- HDU 1874畅通工程续(迪杰斯特拉算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) ...
- HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)
题目链接: 传送门 畅通工程续 Time Limit: 1000MS Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...
- HDU 1874 畅通工程续 SPFA || dijkstra||floyd
http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目大意: 给你一些点,让你求S到T的最短路径. 我只是来练习一下SPFA的 dijkstra+邻接矩阵 ...
- HDU——1874畅通工程续(邻接矩阵弗洛伊德)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 1874 畅通工程续(迪杰斯特拉优先队列,floyd,spfa)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU——1874畅通工程续(Dijkstra与SPFA)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
随机推荐
- Leetcode 001. 两数之和(扩展)
1.题目要求 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 2.解法一:暴力法(for*for,O(n*n)) ...
- CMDB服务器管理系统【s5day88】:采集资产之整合插件
以后导入配置文件不用去from conf而是导入from lib.config,因为在这可以导入global_settings和settings.py import sys import os imp ...
- [技巧篇]10.那些年我们一起优化过的MyEclipse8.6
这里里面是针对于四海的给位学生预留的视频,请自行下载,我希望对大家有所帮助 我这里使用了百度网盘,这里的东西还是比较多的!如果喜欢请关注我,当好胖先生的粉丝 链接:http://pan.baidu.c ...
- 2050年这些职业将逐渐被AI(人工智能)取代
耳熟能详的人工智能 深蓝Deep Blue是美国IBM公司生产的一台超级国际象棋电脑,重1270公斤,有32个大脑(微处理器),每秒钟可以计算2亿步."深蓝”输入了一百多年来优秀棋手的对 ...
- 解决SpringSecurity限制iframe引用页面的问题
使用Spring Security的过程中,需要使用iframe来引入其他域的页面,页面会报X-Frame-Options的错误,试了好几种方法一直未能很好的解决这个问题. 这里涉及到Spring S ...
- 【hdu5217-括号序列】线段树
题意:给一串括号,有2个操作,1.翻转某个括号.2.查询某段区间内化简后第k个括号是在原序列中的位置.1 ≤ N,Q ≤ 200000. 题解: 可以知道,化简后的序列一定是)))((((这种形式的. ...
- 洛谷P2868 [USACO07DEC]观光奶牛 Sightseeing Cows
题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...
- 浅谈游戏中BUFF的设计要点
其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...
- MySQL:Can't create test file XXX.lowe-test
问题说明 今天部署MySQL,在使用mysql_install_db,初始化数据库时报如下错误 180622 11:36:38 mysqld_safe Starting mysqld daemon w ...
- C++学习之路(六):实现一个String类
直接贴代码吧,这段时间准备面试也正好练习了一下. class String { public: String(const char *str = ""); ~String(void ...