Invitation Cards---poj1511(spfa)

题目链接:http://poj.org/problem?id=1511

有向图有n个点m条边,求点1到其他n-1个点的最短距离和+其他点到点1的最小距离和;

和poj3268一样,但是本题的数据范围较大,只能用spfa+邻接表写,不能用vector;

两个spfa即可;

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <queue>
#include <algorithm>
#include <map>
#include <string>
typedef long long LL;
///#define INF 0x3f3f3f3f
#define INF 100000000000000
#define N 1000100

using namespace std;

struct node
{
    int v;
    LL w;
    node(){};
    node(int v, LL w):v(v),w(w){}
};

vector<node > G[N];
vector<node > G1[N];

int vis[N], n, m;
LL dist[N];

LL spfa1(int s)
{
    for(int i=1; i<=n; i++)
        dist[i] = INF;
    dist[s] = 0;
    queue<int> Q;
    Q.push(s);
    memset(vis, 0, sizeof(vis));
    vis[s] = 1;
    while(!Q.empty())
    {
        int p = Q.front(); Q.pop();
        vis[p] = 0;
        for(int i=0, len=G[p].size(); i<len; i++)
        {
            node q = G[p][i];
            if(dist[q.v] > dist[p] + q.w)
            {
                dist[q.v] = dist[p] + q.w;
                if(!vis[q.v])
                {
                    vis[q.v] = 1;
                    Q.push(q.v);
                }
            }
        }
    }
    LL ans = 0;
    for(int i=1; i<=n; i++)
        ans += dist[i];
    return ans;
}

LL spfa2(int s)
{
    queue<int>Q;
    for(int i=1; i<=n; i++)
        dist[i] = INF;
    memset(vis, 0, sizeof(vis));
    vis[s] = 1;
    dist[s] = 0;
    Q.push(s);
    while(!Q.empty())
    {
        int p = Q.front(); Q.pop();
        vis[p] = 0;
        for(int i=0, len=G1[p].size(); i<len; i++)
        {
            node q = G1[p][i];
            if(dist[q.v] > dist[p] + q.w)
            {
                dist[q.v] = dist[p] + q.w;
                if(!vis[q.v])
                {
                    vis[q.v] = 1;
                    Q.push(q.v);
                }
            }
        }
    }
    LL ans = 0;
    for(int i=1; i<=n; i++)
        ans += dist[i];
    return ans;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d %d", &n, &m);
        for(int i=1; i<=n; i++)
        {
            G[i].clear();
            G1[i].clear();
        }
        for(int i=1; i<=m; i++)
        {
            int u, v; LL w;
            scanf("%d %d %I64d", &u, &v, &w);
            G[u].push_back(node(v, w));
            G1[v].push_back(node(u, w));
        }
        LL ans = spfa1(1);
        ans += spfa2(1);
        printf("%I64d\n", ans);
    }
    return 0;
}

时间: 2024-10-11 11:32:33

Invitation Cards---poj1511(spfa)的相关文章

HDU 2680Choose the best route (SPFA)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2680 百度之星编程大赛--您报名了吗? 杭电ACM 2014暑期集训队--选拔安排~ Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis

poj 1860 Currency Exchange(SPFA)

题目链接:http://poj.org/problem?id=1860 Description Several currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currencies. There can b

模板C++ 03图论算法 1最短路之单源最短路(SPFA)

3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于0, 就说这条路是一个负权回路. 回归正题,SPFA是bellman-ford的一种改进算法,由1994年西安交通大学段凡丁提出.它无法处理带有负环的图,判断方法:如果某个点进入队列的次数超过N次则存在负环. SPFA的两种写法,bfs和dfs,bfs判别负环不稳定,相当于限深度搜索

POJ1511 Invitation Cards —— 最短路spfa

题目链接:http://poj.org/problem?id=1511 Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 29286   Accepted: 9788 Description In the age of television, not many people attend theater performances. Antique Comedians of Malidine

hiho一下 第二十五周(SPFA)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少? 提示:Super Programming Festival Algorithm. 输入 每个测试点

hihoCoder - 1093 - 最短路径&#183;三:SPFA算法 (SPFA)

#1093 : 最短路径·三:SPFA算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少? 提示:Super Programming Festiv

zoj 3103 Cliff Climbing(spfa )

Cliff Climbing Time Limit: 10 Seconds      Memory Limit: 32768 KB At 17:00, special agent Jack starts to escape from the enemy camp. There is a cliff in between the camp and the nearest safety zone. Jack has to climb the almost vertical cliff by step

codevs 1021 玛丽卡(spfa)

题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需

poj3259(spfa)

自己的第一道spfa,纪念一下,顺便转载一下spfa的原理.先po代码: #include <iostream> #include <queue> using namespace std; const int MAX = 999999; const int MAXN = 501; int minimum(int a, int b){ return a > b ? b : a; } int main() { int t; cin >> t; while (t--){