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 ...
随机推荐
- JN5169 --------- zigbee代码
队列: 需要创建3个标准队列(只创建不使用): ------Queue with handle zps_msgMlmeDcfmInd to receive IEEE 802.15.4 MACcomma ...
- HDU 5961 传递 BFS
题意:中文题,就是判断一个竞赛图拆成两个图,判断是否都传递 思路:分别BFS判深度即可,用这种方法注意要进行读入优化. /** @Date : 2016-11-18-20.00 * @Author : ...
- 2015/9/17 Python基础(13):函数
函数是对程序逻辑进行结构化或过程化的一种编程方法. Python的函数返回值当什么也不返回时,返回了None和大多数语言一样,Python返回一个值或对象.只是在返回容器对象时,看起来像返回多个对象. ...
- 2015/9/2 Python基础(7):元组
为什么要创造一个和列表差别不大的容器类型?元组和列表看起来不同的一点是元组用圆括号而列表用方括号.而最重要的是,元组是不可变类型.这就保证了元组的安全性.创造元组给它赋值和列表完全一样.除了一个元素的 ...
- 前端表单序列化为json串,以及构造json数组、json串
var parm={ username:"zhangsan", age:24, email:"352400260@qq.com" }; console.log( ...
- java enum用法
基本用法 enum Day { SUNDAY, MONDAY, TUESDAY, WENDSDAY, THURSDAY, FRIDAY, SATURDAY; } 枚举是常量,所以应该用大写. 枚举是对 ...
- No cached version of ..... available for offline mode.
I had same error...Please Uncheck the offline work in Settings. File => Settings => Build, Exe ...
- 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]
序列计数 Time Limit: 30 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Alice想要得到一个长度为n的序 ...
- NGINX: 配置 HSTS
参考: [ 浅析 HSTS - 博客园 ] [ HTTP HSTS协议和 nginx - 运维生存时间] [ HSTS ] Header: Strict-Transport-Security Stri ...
- python3中字典的遍历和合并
#字典的遍历方式 dic={"a":1,"b":2,"c":3} for k in dic: print (k,dic[k]) for k, ...