列表

详情


NC215120. Antinomy与黑风海

描述


为了继续探寻带走了水晶公的爱梅特赛尔克的踪迹,沉迷《原初幻想41》的冒险者Antinomy进入了黑风海,原生种无影爱梅特赛尔克在黑风海使用创造魔法重现了原初世界分裂前的首都:亚马乌罗提

 

Antinomy发现亚马乌罗提是一座精心规划过的城市,且科技高度发达,或者说魔法高度发达(?)。

 

但是走着走着Antinomy发现任务点实在太远也太多了,在古代人面前也是光之打工人。他想知道从他现在的位置出发,每个任务点之间是单向连接的(别问我为什么是单向),每次去交完任务还要返回到才能交下一个任务,总共有个任务点,他想知道交完这个任务再回到,最少需要多长时间。


 我们约定S的值为1,另外,既然能接到任务,那么任务一定是可完成的,换句话说从S出发一定能达到每个任务点,从每个任务点也一定能回到S。

输入描述

第一行输入一行两个整数表示 (任务点的数量+起点的数量) 和 任务点之间道路 的数量

接下来行每行三个整数,分别表示有一条从任务点到任务点的单向连接,需要花费的时间。






输出描述

输出一行一个整数表示最少需要多少时间

示例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;
}

上一题