NC215120. Antinomy与黑风海
描述
为了继续探寻带走了水晶公的爱梅特赛尔克的踪迹,沉迷《原初幻想41》的冒险者Antinomy进入了黑风海,原生种无影爱梅特赛尔克在黑风海使用创造魔法重现了原初世界分裂前的首都:亚马乌罗提
Antinomy发现亚马乌罗提是一座精心规划过的城市,且科技高度发达,或者说魔法高度发达(?)。
但是走着走着Antinomy发现任务点实在太远也太多了,在古代人面前也是光之打工人。他想知道从他现在的位置出发,每个任务点之间是单向连接的(别问我为什么是单向),每次去交完任务还要返回到
才能交下一个任务,总共有
个任务点,他想知道交完这
个任务再回到
,最少需要多长时间。
输入描述
第一行输入一行两个整数
和
表示 (任务点的数量+起点的数量) 和 任务点之间道路 的数量
接下来行每行三个整数
,分别表示有一条从
任务点到
任务点的单向连接,需要花费
的时间。
输出描述
输出一行一个整数表示最少需要多少时间
示例1
输入:
5 10 2 3 5 1 5 5 3 5 6 1 2 8 1 3 8 5 3 4 4 1 8 4 5 3 3 5 6 5 4 2
输出:
83
C++(clang++11) 解法, 执行用时: 508ms, 内存消耗: 48468K, 提交时间: 2020-12-19 17:11:18
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,m,dis[2000020],head[2000020],cnt,ans; bool v[2000020]; struct edge{ ll to,next,z; }a[2000020]; void add(int x,int y,int z){ a[++cnt].to=y; a[cnt].z=z; a[cnt].next=head[x]; head[x]=cnt; } void dij(int x){ priority_queue<pair<int,int> > q; q.push(make_pair(0,x)); dis[x]=0; while(q.size()){ int now=q.top().second; q.pop(); if(v[now]) continue; v[now]=1; for(int i=head[now];i;i=a[i].next){ int y=a[i].to; if(dis[y]>dis[now]+a[i].z){ dis[y]=dis[now]+a[i].z; q.push(make_pair(-dis[y],y)); } } } } int main(){ scanf("%lld %lld",&n,&m); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z);add(y+n+2,x+n+2,z); } for(int i=1;i<=n*2+100;i++) dis[i]=0x7fffffff; dij(1);dij(n+2+1); for(int i=2;i<=n;i++) ans+=dis[i]+dis[n+2+i]; cout<<ans; }