【SPFA】POJ1511-Invitation Cards

2题目大意】

给出一张有向图,以1位源点,求“从源点出发到各点的距离”和“与各点返回源点的距离和”相加得到的和。

【思路】

毫无疑问是最短路径,但是这数据量就算是SPFA也绝壁会超时啊,抱着必死的心态写了submitt,居然AC..才意识到Time Limit: 8000MS。

大体的实现方法就用SPFA先计算出单源最短路径,接着再把每一条边中起始点和终止点进行对话,把各点返回源点的最短路径转换为单源最短路径,重复操作。

SPFA的思路大致如下:先将源点加入队列。对于队列中的队首,对于以它为起始点的每一条边,如果通过改变到达终止点要比直接到达终止点距离短,则更改到达终止点的距离。如果当前终止点不再队列里,则入队。判断某一点是否在队列里,我们通过一个vis数组进行维护。以当前队首为起始点的每一条边扫描结束之后,则出队。直至队列为空,说明到没点的距离不再改变,退出循环。

要注意两点:

(1)因为有多组输入,每次不要忘记把ans清零或其他数组初始化,否则结果会叠加。

(2)读入数据是从编号1开始,然而数组下标是从0开始,所以每次读入时就将每一个点的编号减一,输出时再加一。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

const int MAXN=1000000+5;
const long long INF=1000000000;
long long ans;
int first[MAXN],next[MAXN];
int vis[MAXN];
int dis[MAXN];
struct Rec
{
    int ori,dec,len;
};
Rec edge[MAXN];
/*first ÒÔijһµãΪÆðµãµÄµÚÒ»Ìõ±ß*/
/*Ó뵱ǰ±ßͬÆðµãµÄÏÂÒ»Ìõ±ß*/
int m,n;//m´ú±í³µÕ¾Êý£¬n´ú±íÏß·Êý 

void SPFA()
{
     memset(vis,0,sizeof(vis));
    for (int i=0;i<m;i++)
    {
        dis[i]=INF;
        first[i]=-1;
    }

    for (int i=0;i<n;i++)
    {
        next[i]=first[edge[i].ori];
        first[edge[i].ori]=i;
    }

    queue<int> que;
    que.push(0);
    vis[0]=1;
    dis[0]=0;
    while (!que.empty())
    {
        int k=first[que.front()];
        while (k!=-1)
        {
            if (dis[edge[k].dec]>dis[edge[k].ori]+edge[k].len)
            {
                dis[edge[k].dec]=dis[edge[k].ori]+edge[k].len;
                if (vis[edge[k].dec]==0)
                {
                    que.push(edge[k].dec);
                    vis[edge[k].dec]=1;
                }
            }
            k=next[k];
        }
        vis[que.front()]=0;
        que.pop();
    }
    for (int i=0;i<m;i++) ans+=dis[i];
}

void turn()
{
    for (int i=0;i<n;i++)
    {
        int temp=edge[i].dec;
        edge[i].dec=edge[i].ori;
        edge[i].ori=temp;
    }
}

int main()
{
    int kase;
    scanf("%d",&kase);
    for (int cases=0;cases<kase;cases++)
    {
       ans=0;
        scanf("%d%d",&m,&n);
        for (int i=0;i<n;i++)
        {
            scanf("%d%d%d",&edge[i].ori,&edge[i].dec,&edge[i].len);
            edge[i].ori--;
            edge[i].dec--;
        }
        SPFA();
        turn();
        SPFA();
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-08-25 14:29:50

【SPFA】POJ1511-Invitation Cards的相关文章

poj1511 Invitation Cards

poj1511 题意:就是求所有的节点到节点 1,然后从节点1返回的最小距离的和. 简单SPFA,和poj 3268 无多少差异. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<queue> #include<map> #include<stack> #includ

HDU1224 Free DIY Tour 【SPFA】

Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3939    Accepted Submission(s): 1262 Problem Description Weiwei is a software engineer of ShiningSoft. He has just excellently fulf

boj 454 帮帮小叮当【SPFA】

题目链接:http://code.bupt.edu.cn/problem/p/454/ 454. 帮帮小叮当 时间限制5000 ms 内存限制 65536 KB 题目描述 小叮当刚刚学会了传送门的使用方法,可是它不小心跌落到二维空间一个 n * m 的矩阵格子世界的入口(1,1)处, 他得知出口在(n,m)处,每穿越一个格子门,它的体力值会下降. 又饿又累的他 IQ 已经降为负数了,聪明的你,能帮他规划一下路线,使得它体力值下降的最少吗? 每一行有且仅有一个传送门,但是小叮当上课睡着了,只学会了

HDU1142 A Walk Through the Forest 【SPFA】+【记忆化搜索】

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5688    Accepted Submission(s): 2089 Problem Description Jimmy experiences a lot of stress at work these days, especial

POJ 2449 Remmarguts&#39; Date【SPFA】【A*】

Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 21978 Accepted: 5982 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he to

HDU1217 Arbitrage 【SPFA】

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4460    Accepted Submission(s): 2032 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

POJ2253&amp;ZOJ1942--Frogger【SPFA】单源最短路变形

链接:http://poj.org/problem?id=2253 题意:一个青蛙在一块石头上,看到了另一个青蛙在另一块石头上,它想跳过去找它,如果距离太远它就需要借助别的石头当跳板,两块石头之间的青蛙距离被定义成两块石头之间所有路径中最大跳跃距离的最小值,求两个青蛙之间的青蛙距离. poj2263和它类似,链接:http://poj.org/problem?id=2263 解题报告:Here 这是最短路的变形,每两点之间都有路可以跳,更新最短路的值,权值记录成目前到这一点的最小青蛙距离就行了

HDU3339 In Action 【SPFA】+【01背包】

In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4099    Accepted Submission(s): 1306 Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project

【CF815D】Karen and Cards 单调栈+扫描线

[CF815D]Karen and Cards 题意:一张卡片有三个属性a,b,c,其上限分别为A,B,C,现在有n张卡片,定义一张卡片能打败另一张卡片当且仅当它的至少两项属性要严格大于另一张的对应属性.问在所有可能的卡片中,有多少种能打败这全部n张卡. n,A,B,C<=500000 题解:我们反过来,统计哪些卡片不能打败全部的卡. 我们先确定一个属性c,那么对于某张卡片(ai,bi,ci),如果c<=ci,则要求!(a>ai&&b>bi):如果c>ci,则

POJ1511 Invitation Cards【SPFA】

Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 20229 Accepted: 6612 Description In the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They want to