题目描述
P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。
输入描述:
第一行有4个正整数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
思路:这题明显是一个最短路裸题,利用邻接表进行存储,直接代spfa板子即可
AC代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int N=1010,M=20010;
int n,m,s,t;
int h[N],ne[M],e[M],w[M],idx;
int dist[N];
bool st[N];
void add(int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int spfa()
{
memset(dist,0x3f,sizeof dist);
dist[s]=0;
queue<int> q;
q.push(s);
while(q.size())
{
int t=q.front();
q.pop();
st[t]=0;
for(int i=h[t];~i;i=ne[i])
{
int j=e[i];
if(dist[j]>dist[t]+w[i])
{
dist[j]=dist[t]+w[i];
if(!st[j])
{
q.push(j);
st[j]=1;
}
}
}
}
if(dist[t]==0x3f3f3f3f)return -1;
return dist[t];
}
int main()
{
memset(h,-1,sizeof h);
scanf("%d%d%d%d",&n,&m,&s,&t);
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c),add(b,a,c);
}
cout<<spfa();
}
题目描述
P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。
输入描述:
第一行有4个正整数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