M
来源:互联网 发布:飞翔打印软件免费版 编辑:程序博客网 时间:2024/04/29 05:17
Think:
1知识点:最短路_spfa()算法+区间移动
2思考:通过知识扩展思路,敢于尝试,善于借鉴,一定要有自己的思想与创新点
vjudge题目链接
建议参考博客
以下为Accepted代码
#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int inf = 0x3f3f3f3f;const int N = 1e2 + 4;int n, m, e[N][N], dis[N], vis[N], lev[N];void spfa(int l, int r);int main(){ int i, j, p, k, u, w, ans; while(~scanf("%d %d", &m, &n)){ ans = inf; memset(e, inf, sizeof(e)); for(i = 1; i <= n; i++){ scanf("%d %d %d", &p, &lev[i], &k); e[0][i] = p;/*模拟入队预处理,使得初始状态全部入队,进而更新*/ for(j = 1; j <= k; j++){ scanf("%d %d", &u, &w); e[u][i] = w; } } for(i = 0; i <= m; i++){/*区间移动寻找最优解*/ spfa(lev[1]-i, lev[1]+m-i); ans = min(ans, dis[1]); } printf("%d\n", ans); } return 0;}void spfa(int l, int r){ queue <int> q; while(!q.empty()){ q.pop(); } memset(dis, inf, sizeof(dis)); memset(vis, 0, sizeof(vis)); dis[0] = 0, vis[0] = 1; q.push(0); while(!q.empty()){ int t1 = q.front(); q.pop(); vis[t1] = 0; for(int i = 1; i <= n; i++){ if(lev[i] < l || lev[i] > r) continue; if(dis[t1] + e[t1][i] < dis[i]){ dis[i] = dis[t1] + e[t1][i]; if(!vis[i]){ vis[i] = 1; q.push(i); } } } }}
阅读全文
0 0
- M
- m
- m,
- m
- m
- M
- ^M
- M
- m
- M
- M
- M
- M
- (?m)
- (?m)
- M
- M
- M
- redis集群服务器迁移报错[ERR] Node XXX.XXX.XXX.XX:7001 is not empty. Either the nodealready knows other nodes
- 新建MySQL数据库的注意事项
- 时间函数的用法
- VirtualBox更改虚拟磁盘大小
- VirtualBox复制已安装的Ubuntu16.04
- M
- 大数据分布式集群搭建(2)
- Exception in thread "main" org.hibernate.HibernateException: get is not valid without active transac
- springmvc文件上传
- Java中有关单链表的操作
- 算命用琥珀水晶球
- learning之观察者模式
- android studio导入第三方project报红,gradle与gradle插件版本问题
- MySQL触发器语法详解