链接:https://www.nowcoder.com/acm/contest/136/I
来源:牛客网
题目描述
P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。
输入描述:
第一行有5个正整数n,m,s,t。
接下来m行,每行3个数a,b,v描述一条无向道路a——b,长度为v。
输出描述:
如果有解,输出一行,表示满足条件的最短公交线路的长度c。
否则,输出“-1”
备注:
对于100%的测试数据:
1 ≤ s,t ≤ n ≤ 1000
1 ≤ m ≤ 10000
1 ≤ 道路的长度 ≤ 10000
分析:一个裸的最短路模板题
搞不懂搞不懂,比赛的时候为什么没有人过这个题?
这套题目后面的题都好做,卡在前面真的难受
这榜真的好歪
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<cmath> #include<bits/stdc++.h> #define maxn 1010 using namespace std; vector<pair<int,int> >E[maxn]; int n,m; int d[maxn]; void init() { for(int i=0;i<maxn;i++) E[i].clear(); for(int i=0;i<maxn;i++) d[i]=1e9; } int main() { while(cin >> n>> m) { int s,t; scanf("%d%d",&s,&t); init(); for(int i=0;i<m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); E[x].push_back(make_pair(y,z)); E[y].push_back(make_pair(x,z)); } priority_queue<pair<int,int> >Q; d[s]=0; Q.push(make_pair(-d[s],s));//使得返回最小值,本来是返回最大值 while(!Q.empty()) { int now = Q.top().second; Q.pop(); for(int i=0;i<E[now].size();i++) { int v = E[now][i].first; if(d[v]>d[now]+E[now][i].second) { d[v]=d[now]+E[now][i].second; Q.push(make_pair(-d[v],v)); } } } if(d[t]==1e9) printf("-1 "); else printf("%d ",d[t]); } return 0; }