您的位置:首页 > 其它

CODEVS 1021 玛丽卡 最短路模板题

2015-08-27 18:06 381 查看
这道题就是一个最短路模板题,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
= 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: