kuangbin_ShortPath R (HDU 4370)
2016-01-18 21:32
661 查看
出题人真是脑洞堪比黑洞 (然后自己也被吸进去了
理解一遍题意 三个条件可以转化为 1的出度是1, n的入度是1, 2~n-1的出度等于入度
不难发现1-n的最短路符合题意 然而其实还有另一种情况 1为起止点的最短闭环+n为起止点的最短闭环同样满足要求
因此取两者的min作为结果
理解一遍题意 三个条件可以转化为 1的出度是1, n的入度是1, 2~n-1的出度等于入度
不难发现1-n的最短路符合题意 然而其实还有另一种情况 1为起止点的最短闭环+n为起止点的最短闭环同样满足要求
因此取两者的min作为结果
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <queue> #include <map> #include <vector> #include <set> #include <algorithm> #define INF 0x3F3F3F3F using namespace std; int n, val[310][310]; int dist[310]; bool vis[310]; void spfa(int s) { //计算最短闭环 因此入队节点不是1而是其他所有点 memset(vis, false, sizeof vis); memset(dist, 0x3f, sizeof dist); queue<int> q; for(int i = 1; i <= n; i++){ if(i == s) continue; dist[i] = val[s][i]; q.push(i); vis[i] = true; } while(!q.empty()){ int u = q.front(); q.pop(); vis[u] = false; for(int i = 1; i <= n; i++){ if(i == u) continue; if(dist[i] > dist[u] + val[u][i]){ dist[i] = dist[u] + val[u][i]; if(!vis[i]){ vis[i] = true; q.push(i); } } } } } int main() { int path, dist1, distn; int ans; while(~scanf("%d", &n)){ for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ scanf("%d", &val[i][j]); } } spfa(1); path = dist ; dist1 = dist[1]; spfa(n); distn = dist ; printf("%d\n", min(dist1 + distn, path)); } return 0; }
相关文章推荐
- Matplotlib安装感想
- PHP中递归函数的一个常见逻辑问题
- 也说php从mysql数据库通过服务器端json返回数据出现乱码问题
- zend studio12.5破解方法
- PHP学习练手(十五)
- PHP 二进制 pack() unpack()
- PHP中VC6、VC9、TS、NTS版本的区别与用法详解
- 搭建个人博客&论坛(LAMP):wordpress、discuz、phpMyAdmin
- matplotlib 简介
- php cli模式学习(PHP命令行模式)
- 手把手搭建WAMP+PHP+SVN开发环境
- yii随笔(三) 开启友好路径
- php从A数据库中多张表读数据,插入到B数据库B表里面
- PHP与数据库
- php实现简单的上一页下一页
- php制作数据字典
- Yii2 property,behavior,event
- php mysql实现栏目分类递归
- PHP PSR-4 Autoloader 自动加载(中文版)
- Yii2.0 场景的简单使用