CODEVS 1021 玛丽卡 最短路模板题
2015-08-27 18:06
381 查看
这道题就是一个最短路模板题,SPFA,Dijkstra都可以过。
思路:先求出n到1的最短路,记录路径,之后分别把路径上的每一条边删去再求最短路,对这些之后求出最短路取max就是答案了。
思路想明白了就好说,一开始我想的是依次删除所有的边,求最短路取max,这么做总是有几个点会T,之后改成Dijkstra,还是T,弱渣的我丝毫没有想到是思路错了TAT。
思路:先求出n到1的最短路,记录路径,之后分别把路径上的每一条边删去再求最短路,对这些之后求出最短路取max就是答案了。
思路想明白了就好说,一开始我想的是依次删除所有的边,求最短路取max,这么做总是有几个点会T,之后改成Dijkstra,还是T,弱渣的我丝毫没有想到是思路错了TAT。
#include <cstdio> #include <vector> #include <queue> #include <cstring> #include <algorithm> using namespace std; int n, m, ans, d[1001], fa[1001], f[1001]; bool vis[1001]; vector <int> G[1001]; struct edge{ int u, v, w; }E[500005]; struct node{ int d, num; bool operator < (node i)const{ return d > i.d; } }t; priority_queue <node> q; void dijkstra(int no){ memset(d, 0x7f, sizeof d); memset(vis, 0, sizeof vis); while(q.size()) q.pop(); d = 0; t.num = n, t.d = 0; q.push(t); while(q.size()){ t = q.top(); q.pop(); int u = t.num; if(vis[u]) continue; vis[u] = 1; for(int j = 0; j < G[u].size(); j++){ int e = G[u][j], v = E[e].v == u ? E[e].u : E[e].v, w = E[e].w; if(vis[v] || e == no) continue; if(d[v] > d[u]+w) { d[v] = d[u] + w; t.num = v, t.d = d[v]; q.push(t); if(!no) fa[v] = u, f[v] = e; } } } ans = max(ans, d[1]); } int main() { scanf("%d %d", &n, &m); for(int i = 1; i <= m; i++){ scanf("%d %d %d", &E[i].u, &E[i].v, &E[i].w); G[E[i].u].push_back(i); G[E[i].v].push_back(i); } dijkstra(0); for(int no = 1; no; no = fa[no]) dijkstra(f[no]); printf("%d", ans); }
相关文章推荐
- StrangeIoc框架的详细介绍
- [leetcode]Majority Element C语言
- Java内存管理和垃圾回收
- tkinter杂记=>长期更新
- Scheme 语言概要(上)
- js知识梳理--apply()使用详解
- linux进程间通信方式
- axis webservice调试
- java 逻辑运算符 和 追加字符串
- Android使用ListView divider属性设置分界线,显示不出来的问题
- ViewController之间的block传值
- 地图打印资源 ArcEngine
- 何找出PHP后门
- word中替换被批注的正文的值
- mysql检测重复索引
- leetcode: (125) Valid Palindrome
- 在openwrt上运行c
- 解决spring、springMVC重复扫描导致事务失效的问题
- EditText设置/隐藏光标位置、选中文本和获取/清除焦点
- sql server中高并发情况下 同时执行select和update语句死锁问题