列表

详情


NC17511. 公交线路

描述

P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。


输入描述

第一行有4个正整数n,m,s,t。

接下来m行,每行3个数a,b,v描述一条无向道路a——b,长度为v。

输出描述

如果有解,输出一行,表示满足条件的最短公交线路的长度c。

否则,输出“-1”

示例1

输入:

3 3 1 2
1 2 3
2 3 4
1 3 5

输出:

3

示例2

输入:

3 3 1 2
1 2 5
2 3 3
1 3 1

输出:

4

示例3

输入:

3 1 1 1
1 2 1

输出:

0

原站题解

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

pypy3 解法, 执行用时: 176ms, 内存消耗: 25752K, 提交时间: 2023-01-15 22:12:26

n,m,s,t=map(int,input().split())
d=[float("inf")]*(n+1)
d[s]=0
vis=[0]*(n+1)
mp=[]
for _ in range(n+1):
    mp.append([])
for _ in range(m):
    u,v,w=map(int,input().split())
    mp[u].append([v,w])
    mp[v].append([u,w])
flag=0
for i in range(n):
    k=0
    mind=100000000
    for j in range(1,n+1):
        if vis[j]==0 and d[j]<mind:
            mind=d[j]
            k=j
    if k==0:break
    vis[k]=1
    for j in mp[k]:
        d[j[0]]=min(d[j[0]],d[k]+j[1])
     
if d[t]==float("inf"):
    print(-1)
else:print(d[t])

Python3 解法, 执行用时: 208ms, 内存消耗: 6688K, 提交时间: 2022-06-02 19:42:09

n,m,s,t=map(int,input().split())
d=[float("inf")]*(n+1)
d[s]=0
vis=[0]*(n+1)
mp=[]
for _ in range(n+1):
    mp.append([])
for _ in range(m):
    u,v,w=map(int,input().split())
    mp[u].append([v,w])
    mp[v].append([u,w])
flag=0
for i in range(n):
    k=0
    mind=100000000
    for j in range(1,n+1):
        if vis[j]==0 and d[j]<mind:
            mind=d[j]
            k=j
    if k==0:break
    vis[k]=1
    for j in mp[k]:
        d[j[0]]=min(d[j[0]],d[k]+j[1])
    
if d[t]==float("inf"):
    print(-1)
else:print(d[t])

C++(g++ 7.5.0) 解法, 执行用时: 842ms, 内存消耗: 4352K, 提交时间: 2023-05-26 14:48:50

#include<bits/stdc++.h>
using namespace std;
int n,m,s,t,g[1005][1005];
const int inf=0x3f3f3f3f;
int main()
{
	memset(g,inf,sizeof(g));
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++)
	{
		int a,b,v;
		cin>>a>>b>>v;
		g[a][b]=min(g[a][b],v);
		g[b][a]=g[a][b];
	}
	for(int i=1;i<=n;i++)	g[i][i]=0;
	for(int k=1;k<=n;k++)
	 for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	  	g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
	if(g[s][t]==inf) {
		cout<<-1; return 0;
	}
	cout<<g[s][t];
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 21ms, 内存消耗: 608K, 提交时间: 2023-07-27 20:21:19

#include<bits/stdc++.h>
using namespace std;

int main(){
  int n, m, s, t; cin >> n >> m >> s >> t;
  vector<array<int, 3>> G(m);
  for (auto &[a,b,v]: G) cin >> a >> b >> v;
  vector<int> D(n+1, 0x3f3f3f3f);
  D[s] = 0;
  for (int i = 0; i < n; i++) {
    for (auto [a, b, v]: G) D[a] = min(D[a], D[b]+v), D[b] = min(D[b], D[a]+v);
  }
  if (D[t] == 0x3f3f3f3f) D[t] = -1;
  cout << D[t] << endl;
}

上一题