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 ...
随机推荐
- linux查看文件相关指令
以下内容整理自以下两篇文章: http://www.cnblogs.com/xilifeng/archive/2012/10/13/2722596.html Linux 查看文件内容的命令 http: ...
- jquery禁用按钮
$('#sub').click(function () { var self = $(this); ,'#01b637') ){ return false; } }); function onesho ...
- PowerDesigner16 设置导出sql文件的编码
一: 导出数据库结构sql脚本 Database -> Generate Database 在弹窗中选择Format选项卡,修改Encoding,选择自己需要的编码格式. 二:比较数据库差异 ...
- Chrome浏览器启动页被360导航篡改解决方法
右键Chrome浏览器快捷方式,选择“属性”,在“目标”的结尾处有添加的网址,删了即可. 2 如果在结尾处没有任何网址,可以添加“ -nohome”,这样下次启动时,就会打开一个空白页,也就不会打开被 ...
- bzoj 1406 数论
首先问题的意思就是在找出n以内的所有x^2%n=1的数,那么我们可以得到(x+1)(x-1)=y*n,那么我们知道n|(x+1)(x-1),我们设n=a*b,那么我们对于任意的a,我们满足n%a==0 ...
- 【HNOI】 lct tree-dp
[题目描述]给定2-3颗树,每个边的边权为1,解决以下独立的问题. 现在通过连接若干遍使得图为连通图,并且Σdis(x,y)最大,x,y只算一次. 每个点为黑点或者白点,现在需要删除一些边,使得图中的 ...
- webpack版本1与版本2的若干写法区别
2.x的环境遇到类似this._init is not a function的报错. 版本1.x的写法: resolve: { extensions: ['', '.js', '.vue'] }, m ...
- Java垃圾收集算法
算法名称 过程 优缺点 1. 标记-清除算法 (Mark-Sweep) 分为两个阶段: 1.首先标记出所有需要回收的对象: 2.在标记完成后统一回收所有被标记的对象. 缺点: 1.效率问题:标记和清除 ...
- android 内核调试
这篇文档给出使用android emulator 和 arm-linux-androideabi-gdb 调试 android kernel 的方法 1. checkout goldfish 源码: ...
- Python Matplotlib图表汉字显示成框框的解决办法
http://blog.sina.com.cn/s/blog_662dcb820102vu3d.html http://blog.csdn.net/fyuanfena/article/details/ ...