hdu 1513 Invitation Cards【spfa翻转边】

题目链接:http://acm.acmcoder.com/showproblem.php?pid=1535

题意:有向图,求源点到各个点最短路径和+各个点到源点最短路径和。

spfa求单源最短路径,求各个点到源点最短路径翻转边。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <string>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <map>

using namespace std;

const int MAXN = 2000010;
const int INF = 1e9+10;

struct
{
    int a, b, c;
}Map[MAXN];

int t;
int n, m, a, b, c;

struct Edge
{
    int v;
    int cost;
    Edge(int _v = 0, int _cost = 0)
    {
        v = _v;
        cost = _cost;
    }
};
vector<Edge> E[MAXN];

void addedge(int u, int v, int cost)
{
    E[u].push_back(Edge(v, cost));
}

bool vis[MAXN];
int cnt[MAXN];
int dist[MAXN];

void SPFA(int start, int n)
{
    memset(vis, false, sizeof(vis));
    for (int i = 1; i <= n; i++) dist[i] = INF;
    vis[start] = true;
    dist[start] = 0;
    queue<int> que;
    while (!que.empty()) que.pop();
    que.push(start);
    memset(cnt, 0, sizeof(cnt));
    cnt[start] = 1;
    while (!que.empty())
    {
        int u = que.front(); que.pop();
        vis[u] = false;
        for (int i = 0; i<E[u].size(); i++)
        {
            int v = E[u][i].v;
            if (dist[v]>dist[u] + E[u][i].cost)
            {
                dist[v] = dist[u] + E[u][i].cost;
                if (!vis[v])
                {
                    vis[v] = true;
                    que.push(v);
                    if (++cnt[v] > n) return;
                }
            }
        }
    }
}

int main()
{
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++)
            E[i].clear();
        for (int i = 1; i <= m; i++)
        {
            scanf("%d%d%d", &Map[i].a, &Map[i].b, &Map[i].c);
            addedge(Map[i].a, Map[i].b, Map[i].c);
        }
        int ans = 0;
        SPFA(1, n);
        for (int i = 1; i <= n; i++)
            ans += dist[i];

        for (int i = 1; i <= n; i++)
            E[i].clear();
        for (int i = 1; i <= m; i++)
            addedge(Map[i].b, Map[i].a, Map[i].c);
        SPFA(1, n);
        for (int i = 1; i <= n; i++)
            ans += dist[i];
        printf("%d\n", ans);
    }
    return 0;
}
时间: 2024-11-25 02:44:22

hdu 1513 Invitation Cards【spfa翻转边】的相关文章

hdu 1535 Invitation Cards(SPFA)

Invitation Cards Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Submission(s) : 28   Accepted Submission(s) : 14 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description In the age of telev

HDU 1535 Invitation Cards (POJ 1511)

两次SPFA.求 来 和 回 的最短路之和. 用Dijkstra+邻接矩阵确实好写+方便交换,但是这个有1000000个点,矩阵开不了. d1[]为 1~N 的最短路. 将所有边的 邻点 交换. d2[] 为 1~N 的最短路. 所有相加为 所要答案. 忧伤的是用SPFA  "HDU 1535"  AC了,但是POJ 一样的题 "POJ 1511" 就WA了. 然后强迫症犯了,不停的去测试. 题意中找到一句关键话 :Prices are positive integ

hdu 1535 Invitation Cards(有向图的来回最短路,要反向建图)

题目: 链接:点击打开链接 题意: 给一个图,求1到各点和各点到1最短路. 思路: 先spfa,然后反向建图,在spfa就行了. 代码: #include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; #define INF 100000000 const int N = 1000010; struct node{ int u,v,w

HDU 1535 &amp;&amp; POJ 1511 Invitation Cards (SPFA 模板 + 反向建图)

Invitation Cards HDU: Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) POJ: Time Limit: 8000 MS     Memory Limit: 262144 K       Problem Description In the age of television, not many people attend theater performa

hdu 1535 Invitation Cards 大年初一首A 一次正向SPFA+一次逆向SPFA

Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2311    Accepted Submission(s): 1125 Problem Description In the age of television, not many people attend theater performances.

HDU - 1535 Invitation Cards 前向星SPFA

Invitation Cards In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They want to propagate theater and, most of all, Antique Comedies. They have printed invitation cards wit

poj1511||hdu1535 Invitation Cards spfa

题目链接: Invitation Cards 题意: 给出一个M个点N条边的单向图 1 <= M,N <= 1000000.   给出每条边的两端和经过所需要的时间,求从第一点分别到达所有其他点(2~M)再回到第一点的最短时间 题解: 1 <= M,N <= 1000000.     邻接矩阵肯定会爆内存  所以spfa邻接表解决即可 注意好反向边的建立 代码: #include<iostream> #include<cstdio> #include<

HDU 1535 Invitation Cards (最短路,附SLF优化SPFA)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=1535 题意: 有向图,求点1到点2-n的最短距离之和以及点2-n到点1的最短距离之和 方法: 1.跑1为原点的最短路 2.反向建图(把有向图的边反向,(u,v,w)变成(v,u,w)),跑1为原点的最短路 3.将两者距离之和加和即可(注意用 long long ,int会溢出) 1 void input() 2 { 3 scanf("%d%d", &n, &m); 4 g1.

hdu 1535 Invitation Cards

#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; const int inf=1<<24; const int N=1000000+5; struct node { int to,w; node* next; }; node* edge[N]; node* reedge[N]; int n,m,x,dist[N