P1342 请柬 建反图+dijkstra

题目链接

一句话题意:喊你求出从1出发到所有点的最短路以及所有点的最短路到1的最短路之和。

从1开始跑最短路很容易,直接一遍堆优化dijkstra就完了。

对于其他点到1的最短路又怎么求,不可能一个一个的求,所以想到之前暑假讲关于图论的技巧——建反图。

这样的话问题就迎刃而解了,再在反图上从1开始跑一遍最短路就完了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+7;
const int inf=0x7fffffff;
struct node1{
    int nxt,to,val;
}edge1[maxn*3];
struct node2{
    int nxt,to,val;
}edge2[maxn*3];
priority_queue<pair<long long ,int > >q1;
priority_queue<pair<long long ,int > >q2;
long long dis1[maxn],dis2[maxn];
int cnt1,cnt2;
int n,m;
int x,y,v;
int head1[maxn],head2[maxn];
void add1(int x,int y,int v){
    edge1[++cnt1].nxt=head1[x];
    edge1[cnt1].to=y;
    edge1[cnt1].val=v;
    head1[x]=cnt1;
}
void add2(int x,int y,int v){
    edge2[++cnt2].nxt=head2[x];
    edge2[cnt2].to=y;
    edge2[cnt2].val=v;
    head2[x]=cnt2;
}
bool vis1[maxn];
long long ans1;
void dijkstra1(int x){
    for(int i=1;i<=n;i++){
        dis1[i]=inf;
        vis1[i]=false;
    }
    dis1[x]=0;
    q1.push(make_pair(0,x));
    while(q1.size()){
        int u=q1.top().second;
        q1.pop();
        if(vis1[u]) continue;
        vis1[u]=true;
        for(int i=head1[u];i;i=edge1[i].nxt){
            int v=edge1[i].to;
            if(dis1[v]>dis1[u]+edge1[i].val){
                dis1[v]=dis1[u]+edge1[i].val;
                q1.push(make_pair(-dis1[v],v));
            }
        }
    }
    for(int i=1;i<=n;i++) ans1+=dis1[i];
}
long long ans2;
bool vis2[maxn];
void dijkstra2(int x){
    for(int i=1;i<=n;i++){
        vis2[i]=false;
        dis2[i]=inf;
    }
    dis2[x]=0;
    q2.push(make_pair(0,x));
    while(q2.size()!=0){
        int u=q2.top().second;
        q2.pop();
        if(vis2[u]) continue;
        for(int i=head2[u];i;i=edge2[i].nxt){
            int v=edge2[i].to;
            if(dis2[v]>dis2[u]+edge2[i].val){
                dis2[v]=dis2[u]+edge2[i].val;
                q2.push(make_pair(-dis2[v],v));
            }
        }
    }
    for(int i=1;i<=n;i++) ans2+=dis2[i];
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&v);
        add1(x,y,v);
        add2(y,x,v);
    }
    dijkstra1(1);
    dijkstra2(1);
    long long final=ans1+ans2;
    printf("%lld\n",final);
    return 0;
}

原文地址:https://www.cnblogs.com/LJB666/p/11561117.html

时间: 2024-10-31 12:42:20

P1342 请柬 建反图+dijkstra的相关文章

暑假 D4T1 path(反向建图 dijkstra)

Description 众所周知,Bfk 经常为找不到路而烦恼 Bfk 终于迎来了它高中以来第一个完整的暑假,它决定从假期里抽出一段时间去日本 旅游.可是,对于连教师宿舍都找不到的 Bfk 来说,在旅途中不迷路是一件很困难的事 情.为了避免迷路的尴尬,Bfk 早早的就规划起了它的行程.它将日本的地图抽象成了一 张 n 个点 m 条边的有向图,并在上面选定了行程的起点和终点,但它在规划旅行路径时却 犯了难.它希望路径上的点都满足该点的出边所指向的点都能直接或间接的到达终点,这 样即使它走错了路,也

ZOJ2750Idiomatic Phrases Game 建图Dijkstra

Dijkstra部分不难,主要是建图 #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<iostream> using namespace std; #define INF 10000000 #define maxn 1005 struct bian { string a; string

洛谷 P1342 请柬

P1342 请柬 题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被雇来分发这些请柬.每个学生志愿者被指定一个确切的公共汽车站,他或她将留在那里一整天,邀请人们参与. 这里的公交系统是非常特殊的:所有的线路都是单向的,连接两个站点.公共汽车离开起始点,到达目的地之后又空车返回起始点.学生每天早上从总部出发,乘公交车到一个预定的站点邀请乘客.每个站点都被安排了一名

P1342 请柬

题目描述 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被雇来分发这些请柬.每个学生志愿者被指定一个确切的公共汽车站,他或她将留在那里一整天,邀请人们参与. 这里的公交系统是非常特殊的:所有的线路都是单向的,连接两个站点.公共汽车离开起始点,到达目的地之后又空车返回起始点.学生每天早上从总部出发,乘公交车到一个预定的站点邀请乘客.每个站点都被安排了一名学生.在一天结束的

POJ 1149 PIGS (网络最大流 Dinic 建对图你就赢了)

PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17598   Accepted: 7977 Description Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlock any pighouse because he doesn't have the keys. Customers come t

游戏得分 建立反图SPFA / bellman

何老板最近在玩一款游戏,游戏虽然简单,他仍旧乐此不疲. 游戏地图由n个关卡构成,关卡编号1到n.起点在1号关卡,终点在n号关卡. 关卡间通过m条有向道路相连,每条道路都有一个分值,表示每经过一次该道路,玩家都将获得对应分值. 何老板想知道,他操控游戏角色从起点走到终点,最多能得多少分?请你帮忙计算! 解: 考试的时候dfs炸了 ... 考虑这个环能否到达终点 等价于 这个终点能否到达这个环 所以想到建立反图 bellman的做法的话 是进行n次松弛后 看n号点是否还能被松弛 是就存在合法的环 c

自建免费图床, 免费资源利用 onedriver api 自建图床

免费图床, 都推荐的比较稳定的 推荐看 这里, 已经总结了 免费图床点这里 用别人的不放心, 对接api 不灵活, 自己需求主要也是做站 提供一个思路, 使用onedriver 或 google driver api 自建免费图床 cocook免费图床 要求, 当然要回简单的编码, 是什么语言无所谓 有服务器, 最基础配置就行了 看懂 oneDriver api, 现在老的api授权已经不好用, 推荐直接用最新的 建立 注册clintid 地址 注册点这里 api 地址, 主要是 授权(使用au

飞行路线 HYSBZ - 2763 (分层图+Dijkstra &amp;&amp; Spfa)

飞行路线 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机.航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机.那么Alice和Bob这次出行最少花费多少? Input 数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数. 第二行有两个

【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status][Discuss] Description 相信大家都用过地图上的路径规划功能,只要输入起点终点就能找出一条最优路线.现在告诉你一张地图的信息,请你找出最优路径(即最短路径).考虑到实际情况,一辆车加满油能开的时间有限,所以在地图上增加了几个加油站. 地图由点和双向边构成,每个点代表一个路口,也有可