链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
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 3 1 2 1 2 3 2 3 4 1 3 5
输出
复制3
3
示例2
输入
复制3 3 1 2 1 2 5 2 3 3 1 3 1
3 3 1 2 1 2 5 2 3 3 1 3 1
输出
复制4
4
示例3
输入
复制3 1 1 1 1 2 1
3 1 1 1 1 2 1
输出
复制0
0
//迪杰斯特拉
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,s,t;
struct ty
{
int next,to,w;
};
int head[10010];
ty edge[20010];
int cnt;
int dist[10010];
int st[10010];
void addedge(int x,int y,int z)
{
edge[++cnt].to=y;
edge[cnt].next=head[x];
edge[cnt].w=z;
head[x]=cnt;
}
struct ty2
{
int x,dist;
bool operator <(const ty2 &a)const
{
return dist>a.dist;
}
};
priority_queue<ty2>q;
int dij(int s,int t)
{
dist[s]=0;
ty2 tmp;
tmp.dist=0;
tmp.x=s;
q.push(tmp);
while(!q.empty())
{
tmp=q.top();
q.pop();
//if(st[tmp.x])continue;
st[tmp.x]=1;
for(int i=head[tmp.x];i!=-1;i=edge[i].next)
{
int y=edge[i].to;
if(dist[y]>dist[tmp.x]+edge[i].w)
{
dist[y]=dist[tmp.x]+edge[i].w;
if(!st[y])
{
ty2 tmp2;
tmp2.x=y;
tmp2.dist=dist[y];
q.push(tmp2);
}
}
}
}
if(dist[t]==0x3f3f3f3f)return -1;
return dist[t];
}
int main()
{
memset(head,-1,sizeof(head));
memset(dist,0x3f,sizeof(dist));
cin>>n>>m>>s>>t;
int a,b,c;
for(int i=1;i<=m;++i)
{
cin>>a>>b>>c;
addedge(a,b,c);
addedge(b,a,c);
}
cout<<dij(s,t)<<endl;
return 0;
}
spfa
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,m,s,t;
struct ty
{
int next,t,w;
};
int cnt;
ty edge[20010];//无向边开双倍!!!!!
int head[10010];
int inqueue[10010];
int dis[10010];
void addedge(int x,int y,int z)
{
edge[++cnt].t=y;
edge[cnt].next=head[x];
edge[cnt].w=z;
head[x]=cnt;
}
queue<int>q;
int spfa(int s,int t)
{
dis[s]=0;
inqueue[s]=1;
q.push(s);
while(!q.empty())
{
int tmp=q.front();
q.pop();
inqueue[tmp]=0;
for(int i=head[tmp];i!=-1;i=edge[i].next)
{
int y=edge[i].t;
if(dis[y]>dis[tmp]+edge[i].w)
{
dis[y]=dis[tmp]+edge[i].w;
if(!inqueue[y])
{
q.push(y);
inqueue[y]=1;
}
}
}
}
if(dis[t]>=0x3f3f3f)return -1;
return dis[t];
}
int main()
{
memset(head,-1,sizeof(head));
memset(dis,0x3f3f3f,sizeof(dis));
cin>>n>>m>>s>>t;
int a,b,c;
for(int i=1;i<=m;++i)
{
cin>>a>>b>>c;
addedge(a,b,c);
addedge(b,a,c);
}
cout<<spfa(s,t)<<endl;
return 0;
}