hdu 1874 畅通工程续(最短路spfa邻接矩阵)
2015-11-03 14:41
567 查看
题目地址
题目大意:给出n个点m条边,并给出起点和终点,求起点到终点的最短路
解题思路:1.允许有负权边,可以判断负环
2.时间复杂度:O(ke),k指的是所有顶点的进队的平均次数,可以证明k<=2,e为边数
3.可以用SPFA来存在是否存在环,如果是的话就是存在一条边的松弛操作大于等于n。
题目大意:给出n个点m条边,并给出起点和终点,求起点到终点的最短路
解题思路:1.允许有负权边,可以判断负环
2.时间复杂度:O(ke),k指的是所有顶点的进队的平均次数,可以证明k<=2,e为边数
3.可以用SPFA来存在是否存在环,如果是的话就是存在一条边的松弛操作大于等于n。
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <vector> #include <queue> #include <utility> using namespace std; const int INF=0xfffffff; const int maxn=200+10; int n,m; int mp[maxn][maxn]; int dis[maxn]; void SPFA(int s) { for(int i=0;i<n;i++) dis[i]=INF; bool vis[maxn]={0}; vis[s]=true; dis[s]=0; queue<int> q; q.push(s); while(!q.empty()) { int cur=q.front(); q.pop(); vis[cur]=false; for(int i=0;i<n;i++) { if(dis[cur] + mp[cur][i] < dis[i]) { dis[i]=dis[cur] + mp[cur][i]; if(!vis[i]) { q.push(i); vis[i]=true; } } } } } int main() { while(scanf("%d%d",&n,&m) != EOF) { for(int i = 0; i < n; i++) { dis[i] = INF; for(int j = 0; j < n; j++) i==j ? mp[i][j]=0 : mp[i][j]=INF; } for(int i = 0; i < m; i++) { int from,to,val; scanf("%d%d%d",&from,&to,&val); if(mp[from][to] > val) mp[from][to] = mp[to][from] = val; } int s,t; scanf("%d%d",&s,&t); SPFA(s); dis[t]==INF ? printf("-1\n") : printf("%d\n",dis[t]); } return 0; }
相关文章推荐
- CentOS安装mysql数据库
- MySQL远程访问:错误码1130解决方案
- 【解决方法】Xcode因为证书问题经常报的那些错
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- activity之间切换动画不起作用
- css文件和js文件后面带一个问号----2015-1103
- 成为专业程序员的 6 个技巧—兄弟连IT教育
- IntelliJ IDEA TOMCAT部署
- sklearn feature extraction
- Swift 基础知识Part2
- WEB-INF目录与META-INF目录的作用
- 我们为什么使用线程池
- LeetCode--Binary Tree Inorder Traversal
- iOS学习笔记--右滑返回
- Ligerui表格基本操作(二)
- 【BZOJ3687】简单题
- ActiveMQ入门示例
- string类到c的字符数组的方法
- 写个定时任务更新svn
- Ubuntu下进入Android adb/fastboot模式