逃跑(escape)

逃跑(escape)

时间限制: 3 Sec  内存限制: 128 MB

题目描述

输入

第一行是5个正整数,n,m,k,S,T,分别代表无向图点数,边数,蝙蝠的数量,二小姐所在起点的编号,目标点的编号。

第二行是k个正整数,分别代表大小姐每个蝙蝠所在的起点的编号。接下来有m行,每行有4个正整数,u,v,q,p,分别是该边的起点、终点,蝙蝠通过该

路花费的代价,二小姐通过该路花费的代价。

输出

一行,一个整数,所有人物达到终点所需要的代价的和的最小值。

样例输入

5 5 2 3 4

1 5

1 2 3 5

3 2 3 5

2 4 4 9

3 4 9 6

5 4 1 1

样例输出

13

题解:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#include<ctime>
#include<vector>
using namespace std;
int n,m,a,src,des;
struct node
{
    int next,to;
    long long dis,dis2;
}edge[400001];
int head[20001],size=1;
int b[20001];//蝙蝠所在点
long long v1[20001];//各点到终点
long long v2[20001];//二小姐到各点
long long v3[20001];
void putin(int from,int to,long long dis,long long dis2)
{
    size++;
    edge[size].next=head[from];
    edge[size].to=to;
    edge[size].dis=dis;
    edge[size].dis2=dis2;
    head[from]=size;
}
void in(int from,int to,long long dis,long long dis2)
{
    putin(from,to,dis,dis2);
    putin(to,from,dis,dis2);
}
void bfs1()
{
    memset(v1,127/3,sizeof(v1));
    int front=0,tail=0,i,j;
    int p[20001],vis[20001]={0};
    p[tail++]=des;
    v1[des]=0;
    vis[des]=1;
    while(front!=tail)
    {
        int x=p[front++];
        front%=20000;
        vis[x]=0;
        for(i=head[x];i!=-1;i=edge[i].next)
        {
            int y=edge[i].to;
            if(v1[y]>v1[x]+edge[i].dis)
            {
                v1[y]=v1[x]+edge[i].dis;
                if(!vis[y])
                {
                    vis[y]=1;
                    p[tail++]=y;
                    tail%=20000;
                }
            }
        }
    }
}
void bfs2()
{
    memset(v2,127/3,sizeof(v2));
    int front=0,tail=0,i,j;
    int p[20001],vis[20001]={0};
    p[tail++]=src;
    v2[src]=0;
    vis[src]=1;
    while(front!=tail)
    {
        int x=p[front++];
        front%=20000;
        vis[x]=0;
        for(i=head[x];i!=-1;i=edge[i].next)
        {
            int y=edge[i].to;
            if(v2[y]>v2[x]+edge[i].dis2)
            {
                v2[y]=v2[x]+edge[i].dis2;
                if(!vis[y])
                {
                    vis[y]=1;
                    p[tail++]=y;
                    tail%=20000;
                }
            }
        }
    }
}
void bfs3()
{
    memset(v3,128,sizeof(v3));
    int front=0,tail=0,i,j;
    int p[20001],vis[20001]={0};
    for(i=1;i<=a;i++)
    {
        p[tail++]=b[i];
        v3[b[i]]=v1[b[i]];
        vis[b[i]]=1;
    }
    while(front!=tail)
    {
        int x=p[front++];
        front%=20000;
        vis[x]=0;
        for(i=head[x];i!=-1;i=edge[i].next)
        {
            int y=edge[i].to;
            if(v3[y]<v3[x]-edge[i].dis)
            {
                v3[y]=v3[x]-edge[i].dis;
                if(!vis[y])
                {
                    vis[y]=1;
                    p[tail++]=y;
                    tail%=20000;
                }
            }
        }
    }
}
long long ans,ans1;
int main()
{
    memset(head,-1,sizeof(head));
    int i,j;
    scanf("%d%d%d%d%d",&n,&m,&a,&src,&des);
    for(i=1;i<=a;i++)
        scanf("%d",&b[i]);
    for(i=1;i<=m;i++)
    {
        int from,to;long long dis,dis2;
        scanf("%d%d%lld%lld",&from,&to,&dis,&dis2);
        in(from,to,dis,dis2);
    }
    bfs1();bfs2();bfs3();
    ans+=v2[des];
    for(i=1;i<=a;i++)
        ans+=v1[b[i]];
    ans1=ans;
    for(i=1;i<=n;i++)
    {
        ans1=min(ans1,ans-v2[des]+v2[i]+v1[i]-v3[i]);
    }
    cout<<ans1;
    return 0;
}
时间: 2024-10-10 22:06:27

逃跑(escape)的相关文章

bzoj1340: [Baltic2007]Escape逃跑问题

题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1340 挺好的一道题... 有曲线不能从左下到右上等价于,不存在从左上到右下的曲线,满足曲线一直在圆内或矩形边界上 所以删除数量最小的圆,使得上下不连通即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define rep(i,l,r) for(int i=l;i<=r;++i) 4 const int N=202333,in

猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒

程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒.(C#语言)要求:  1.要有联动性,老鼠和主人的行为是被动的.2.考虑可扩展性,猫的叫声可能引起其他联动效应. 要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法.    2. 对老鼠和主人进行抽象 1 public interface Observer 2 { 3 void Response(); //观察者的响应,如是老鼠见到猫的反映 4 } 5 public interface Subject 6 { 7 void

FZU 2196 Escape(BFS预处理+BFS搜索)

Problem 2196 Escape Accept: 123    Submit: 678 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 小明进入地下迷宫寻找宝藏,找到宝藏后却发生地震,迷宫各处产生岩浆,小明急忙向出口处逃跑.如果丢下宝藏,小明就能迅速离开迷宫,但小明并不想轻易放弃自己的辛苦所得.所以他急忙联系当程序员的朋友你(当然是用手机联系),并告诉你他所面临的情况,希望你能告诉他是否能成功带着宝藏

【HDU - 3533】Escape(bfs)

Escape  Descriptions: 一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y问这个人能不能安全到达终点要求: 1.人不能到达炮塔所在的坐标2.炮塔会挡住子弹3.途中遇到子弹是安全的,但是人如果停在这个坐标,而子弹也刚好到这个坐标,人就被射死4.人可以选择停止不动 Input 对于每个测试用例,第一行有四个整数,m.n.k和d (2<=m, n<=100, 0<=k<=100, m

newLISP处理mysql escape character

什么是转义字符 mysql的escape character指的是需要转义的特殊字符,这些字符出现在sql语句中,如果没有转移会导致sql语法报错或者有sql注入攻击的可能. 主要有以下几种都需转义: \x00, \n, \r, \, ', " and \x1a. 比如' 就需要变成\' 下面是sql测试: mysql> INSERT INTO nodes(name) VALUES ('select a.dt, count(*), count(distinct a.uv) from (se

hzau 1204 Escape from the Darkness

1204: Escape from the Darkness Time Limit: 1 Sec  Memory Limit: 1280 MBSubmit: 93  Solved: 3[Submit][Status][Web Board] Description Xiao Ming, a high school student, learnt blackbody radiation from the physics class. The black body on the book is ind

Python 3 与 Javascript escape 传输确保数据正确方法和中文乱码解决方案

前几天用Python的Bottle框架写个小web程序,在进行Ajax交互之时,前端则先用 JSON.stringify 来将类序列化,然后用escape() 函数将其编码,确保传输正确. 再基本上配合上Jquery的$.ajax应该就可以了,可能是经验不足,即使编码之后的数据依然在 Python 中难以处理. 后来慢慢思考出一种方式,在网上也发现了类似的方式,于是将其实现. 基本思路如下: escape('你好世界ABC'); //返回 "%u4F60%u597D%u4E16%u754CABC

【转】escape()、encodeURI()、encodeURIComponent()区别详解

escape().encodeURI().encodeURIComponent()区别详解 原文链接:http://www.cnblogs.com/tylerdonet/p/3483836.html JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent . 下面简单介绍一下它们的区别 1 escape()函数 定义和用法 e

hdu 3605 Escape 二分图的多重匹配(匈牙利算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 8001    Accepted Submission(s): 1758 Problem Description 2012 If this is the end of th