CODEVS 1021 玛丽卡 最短路模板题

来源:互联网 发布:深锋网络 编辑:程序博客网 时间:2024/06/04 17:42
这道题就是一个最短路模板题,SPFA,Dijkstra都可以过。
思路:先求出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[n] = 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);}

0 0
原创粉丝点击