列表

详情


NC50381. 道路和航线

描述

FarmerJohn正在一个新的销售区域对他的牛奶销售方案进行调查。他想把牛奶送到T个城镇,编号为1到T。这些城镇之间通过R条道路(编号为1到R)和P条航线(编号为1到P)连接。每条道路i或者航线i连接城镇A_iB_i,花费为C_i
对于道路,,然而航线的花费很神奇,花费C_i可能是负数。道路是双向的,可以从A_iB_i,也可以从B_iA_i,花费都是C_i。然而航线与之不同,只可以从A_iB_i
事实上,由于最近恐怖主义太嚣张,为了社会和谐,出台了一些政策保证:如果有一条航线可以从A_iB_i,那么保证不可能通过一些道路和航线从B_i回到A_i。由于FJ的奶牛世界公认十分给力,他需要运送奶牛到每一个城镇。他想找到从发送中心城镇S把奶牛送到每个城镇的最便宜的方案,或者知道这是不可能的。

输入描述

第一行为四个空格隔开的整数:T,R,P,S;
第二到第R+1行:三个空格隔开的整数(表示一条道路):A_i,B_iC_i
第R+2到R+P+1行:三个空格隔开的整数(表示一条航线):A_i,B_iC_i

输出描述

输出T行,第i行表示到达城镇i的最小花费,如果不存在输出NO PATH。

示例1

输入:

6 3 3 4 
1 2 5 
3 4 5 
5 6 10 
3 5 -100 
4 6 -100 
1 3 -10 

输出:

NO PATH
NO PATH
5
0
-95
-100

说明:

一共六个城镇。在1和2,3和4,5和6之间有道路,花费分别是5,5,10。同时有三条航线:3 \to54 \to61 \to3,花费分别是-100,-100,-10。FJ的中心城镇在城镇4。FJ的奶牛从4号城镇开始,可以通过道路到达3号城镇。然后他们会通过航线达到5和6号城镇。但是不可能到达1和2号城镇。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 373ms, 内存消耗: 3972K, 提交时间: 2022-08-13 20:20:50

// NC50381 - 道路和航线
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>

using namespace std;

int main(int argc, char *argv[])
{
	const int INF = 1000000000;
	cin.tie(0)->sync_with_stdio(0);
	int T, R, P, S;
	cin >> T >> R >> P >> S;
	vector<vector<pair<int, int>>> g(T);
	int u, v, w;
	for (int i = 0; i < R; i++) {
		cin >> u >> v >> w;
		g[u - 1].push_back({v - 1, w});
		g[v - 1].push_back({u - 1, w});
	}
	for (int i = 0; i < P; i++) {
		cin >> u >> v >> w;
		g[u - 1].push_back({v - 1, w});
	}
	vector<int> dist(T, INF);
	deque<int> q;
	dist[S - 1] = 0;
	for (q.push_back(S - 1); !q.empty(); ) {
		auto u = q[0];
		q.pop_front();
		for (auto t: g[u]) {
			int v = t.first, w = t.second;
			if (dist[v] > dist[u] + w) {
				dist[v] = dist[u] + w;
				if (q.empty() || dist[v] > dist[q.front()])
					q.push_back(v);
				else
					q.push_front(v);
			}
		}
	}
	for (auto x: dist)
		if (x != INF)
			cout << x << "\n";
		else
			cout << "NO PATH\n";
	return 0;
}

C++(clang++11) 解法, 执行用时: 582ms, 内存消耗: 2696K, 提交时间: 2021-02-04 21:19:56

#include<bits/stdc++.h>
using namespace std;
int t,r,p,s,a,b,c,i,e[250001],f[250001],h[25011],w[250001],l[25011],v[25011],k,x,M=0x3f3f3f3f;
deque<int>q;
void g(int a,int b,int c)
{
	e[++k]=b,f[k]=h[a],h[a]=k,w[k]=c;
}int main()
{
	cin>>t>>r>>p>>s;
	q.push_back(s);
	for(;r--;)
	{
		cin>>a>>b>>c;
		g(a,b,c),g(b,a,c);
	}for(;p--;)
	{
		cin>>a>>b>>c;
		g(a,b,c);
	}for(i=1;i<=t;i++)l[i]=M;
	memset(v,0,sizeof v);
	l[s]=0;v[s]=1;
	while(q.size())
	{
		x=q.front();
		q.pop_front();
		v[x]=0;
		for(i=h[x];i;i=f[i])
		{
			if(l[x]+w[i]<l[e[i]])
			{
				l[e[i]]=l[x]+w[i];
				if(!v[e[i]])
				{
					v[e[i]]=1;
					if(q.size()&&l[e[i]]<l[q.front()])q.push_front(e[i]);
					else q.push_back(e[i]);
				}
			}
		}
	}for(i=1;i<=t;i++)
	{
		if(l[i]==M)puts("NO PATH");
		else cout<<l[i]<<'\n';
	}
}

上一题