poj1502 MPI Maelstrom,单源最短路的最长距离,dijkstra + 优先队列

点击打开链接

求顶点1到其他点的最短距离的最长距离。。

测试。。dijkstra + 优先队列

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#define for0(a,b) for(a=0;a<b;++a)
#define for1(a,b) for(a=1;a<=b;++a)
#define foru(i,a,b) for(i=a;i<=b;++i)
#define ford(i,a,b) for(i=a;i>=b;--i)
using namespace std;

typedef double db;
typedef long long ll;
const db eps = 1e-8;
const int INF = 1e9;
const int N = 105;
typedef pair<int,int> P;

struct node{
    int v, c;
    node(int v=0, int c=0):v(v),c(c){ }
};
int head[N], next[N*N], to[N*N], val[N*N], tot, n;

void init(){
    memset(head, -1, sizeof head );
    tot = 0;
}

void addedge(int u, int v, int c)
{
    next[tot] = head[u];
    to[tot] = v;
    val[tot] = c;
    head[u] = tot++;
}

int d[N];
bool vis[N];
priority_queue<P, vector<P>, greater<P> > pq;

void dijkstra(int s){
    for(int i=1; i<=n; ++i) {d[i]=INF; vis[i] = false;}
    d[s] = 0;
    while(!pq.empty()) pq.pop();
    pq.push(P(0,s));
    P tmp;
    while(!pq.empty()){
        tmp = pq.top(); pq.pop();
        int &u = tmp.second;
        if(vis[u]) continue;
        vis[u] = true;
        for(int i=head[u]; ~i; i=next[i]){
            int &v = to[i];
            int &cost = val[i];
            if(!vis[v]&&d[v] > d[u] + cost){
                d[v] = d[u] + cost;
                pq.push(P(d[v],v));
            }
        }
    }
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.cpp", "r", stdin);
    freopen("out.cpp","w", stdout);
#endif // ONLINE_JUDGE
    scanf("%d", &n);
    init();
    char x[10];
    for(int i=2; i<=n; ++i){
        for(int j=1; j<i; ++j){
            scanf("%s", x);
            if(x[0]!='x'){
                int c = atoi(x);
                addedge(i, j, c);
                addedge(j, i, c);
            }
        }
    }
    dijkstra(1);
    int ans = -INF;
    for(int i=2; i<=n; ++i) {
        ans = max(d[i], ans);
    }
    printf("%d\n", ans );
    return 0;
}
时间: 2024-10-21 15:56:02

poj1502 MPI Maelstrom,单源最短路的最长距离,dijkstra + 优先队列的相关文章

poj1502 MPI Maelstrom(单源最短路)

题意:表面乍一看output是输出最小值,但仔细研究可以发现,这个最小值是从点1到所有点所花时间的最小值,其实是访问这些节点中的最大值,因为只有访问了最长时间的那个点才算访问了所有点.所以求最短路之后求最大值. #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn = 100 + 5; const int inf = 0x3f3f3f3f;

HDU 2544 最短路 (单源对短路,spfa,Dijkstra,Bellman-Ford)

题意:中文题目 思路:spfa+SLF优化.关于SPFA的详情请戳我 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=105, INF=0x7f7f7f7f; 4 int n, m; 5 bool vis[N]; //标记是否在队列中 6 int dest[N]; //路径长度 7 int mapp[N][N]; 8 9 10 11 int spfa(int s, int e) //求最短路径 12 { 13 me

带权单源最短路[稀疏图](Dijkstra)

因为是稀疏图,所以应当选择邻接表来存储 构造一个邻接表 这只是我的构造方法,有很多种更好的构造方法,大家可以自己去构造 typedef int vertex; typedef int WeightType; //邻接表中单链表的节点 typedef struct ArcNode { int to; WeightType weight; struct ArcNode *next; }ArcNode; //顶点, 存放顶点信息和一个指向第一个与该顶点相连的节点 typedef struct Node

单源最短路

Invitation Cards  http://poj.org/problem?id=1511 dij+priority queue  o (elogv) 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #define mt(a,b) memset(a,b,sizeof(a)) 5 using namespace std; 6 typedef __int64 LL; 7 const int inf=

【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home

https://vjudge.net/contest/66569#problem/A http://blog.csdn.net/wangjian8006/article/details/7871889 邻接矩阵实现的单源最短路 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #include

Dijkstra算法 --- 单源最短路

Dijkstra算法适用于边权值为正的情况,可用于计算正权图上的单元最短路. 其伪代码如下: 设d[v0] = 0, 其他d[i] = INF 循环n次{ 在所有未标号的结点中,选取d值最小的结点x 给结点x加上永久标号 对于从x出发的所有边,执行松弛操作. } //松弛操作的伪代码如下: RELAX(u,v,w) if(u.d + w(u,v) < v.d){ v.d = w.d + w(u,v); pre[v] = u; } Dijkstra算法代码: /* Dijkstra 单源最短路算法

POJ1502 MPI Maelstrom Dijkstra

题意 给出图,从点1出发,求到最后一个点的时间. 思路 单源最短路,没什么好说的.注意读入的时候的技巧. 代码 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int INF = 1000000000; const int maxn = 110; int n; int edge[maxn][maxn

常见模板(欧拉筛素数,最小生成树,快排,并查集,单源最短路)

欧拉筛素数: #include<cstdio> #define maxn 10000000+10 using namespace std; int n,prime[5000001],num_prime=0,m; bool if_prime[maxn]; void euler(int limit) { for(int i=2;i<=limit;i++) { if(!if_prime[i]) prime[++num_prime]=i; for(int j=1;prime[j]*i<=l

利用分支限界法求解单源最短路(Dijkstra)问题

分支限界法定义:采用BFS算法,并使用剪枝函数的算法称为分支界限法. 分支限界法解释:按广度优先的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分支,不断重复这一过程,直到找到答案或者判定无解. 分支界限法常常用到优先队列来选择最佳扩展节点,有时也会用到普通队列,以先进先出为原则来进行筛选. 单源最短路问题定义:给定有向图和起点,寻找到达所有点的最短路径. 单源最短路的分支限界法概述:首先把节点加入优先队列,之后不断地从队列中取出最优扩展点,观察其可抵达的所有目标节点,若当前路径