题目:
A - 一个人的旅行
题意:
中文不在多说,多个起点,将这多个起点与0之间的长度定为0,最后输出多个终点中最小的距离即可;
事实上这道题使用dijkstra很方便就可以得出,但是很久没有做类似的题目,想使用一下邻接表优化的spfa;
第一次代码:
//wa未找到原因
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std;
const int inf=0x3f3f3f3f;
int dis[1000005];
bool book[1000005];
int t,s,d;
int u[1000005],v[1000005],w[1000005];
int first[1000005],nextt[1000005];
void intt()
{
memset(book,0,sizeof(book));
memset(dis,0x3f,sizeof(dis));
memset(first,-1,sizeof(first));
}
void solve()
{
queue<int>q;
q.push(1);
dis[1]=0;
book[1]=1;
while(!q.empty())
{
int z=q.front();
int k=first[z];
while(k!=-1)
{
if(dis[v[k]]>dis[u[k]]+w[k])
{
dis[v[k]]=dis[u[k]]+w[k];
if(book[v[k]]==0)
{
q.push(v[k]);
book[v[k]]=1;
}
}
k=nextt[k];
}
q.pop();
book[z]=0;
}
}
int main()
{
int k;
while(scanf("%d %d %d",&t,&s,&d)!=EOF)
{
intt();
k=1;
for(int i=1;i<=t;i++)
{
scanf("%d %d %d",&u[k],&v[k],&w[k]);
nextt[k]=first[u[k]];
first[u[k]]=k;
k++;
u[k]=v[k-1];
v[k]=u[k-1];
w[k]=w[k-1];
nextt[k]=first[u[k]];
first[u[k]]=k;
k++;
}
int a;
for(int i=0;i<s;i++)
{
scanf("%d",&a);
u[k]=1;
v[k]=a;
w[k]=0;
nextt[k]=first[u[k]];
first[u[k]]=k;
k++;
u[k]=a;
v[k]=1;
w[k]=0;
nextt[k]=first[u[k]];
first[u[k]]=k;
k++;
}
solve();
//printf("123\n");
int minn=inf;
for(int i=0;i<d;i++)
{
scanf("%d",&a);
minn=min(minn,dis[a]);
}
printf("%d\n",minn);
}
return 0;
}
第二次代码:
参考了一位大佬的
https://blog.csdn.net/lzyws739307453/article/details/98450040
代码:
//一个人的旅行
//一个人的旅行
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1005;//段点数
bool book[maxn];
int dis[maxn],first[maxn],cnt;
struct node
{
int u;//next
int v,w;
node(int uu=0,int vv=0,int ww=0):u(uu),v(vv),w(ww){}
}e[maxn*maxn];
inline void intt()
{
cnt=0;
memset(first,-1,sizeof(first));
memset(book,0,sizeof(book));
memset(dis,0x3f,sizeof(book));
}
inline void add(int u,int v,int w)
{
e[++cnt]=node(first[u],v,w);
first[u]=cnt;
}
void spfa()
{
for(int i=0;i<1005;i++)
dis[i]=inf;
queue<int>q;
q.push(0);
dis[0]=0;
book[0]=1;
while(!q.empty())
{
//printf("12\n");
int u=q.front();
q.pop();
book[u]=0;
for(int i=first[u];~i;i=e[i].u)
{
int v=e[i].v;
int w=e[i].w;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(book[v]==0)
{
q.push(v);
book[v]=1;
}
}
}
}
}
int main()
{
int t,s,d;
int u,v,w;
while(scanf("%d %d %d",&t,&s,&d)!=EOF)
{
intt();
for(int i=0;i<t;i++)
{
scanf("%d %d %d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
int a;
for(int i=0;i<s;i++)
{
scanf("%d",&a);
add(a,0,0);
add(0,a,0);
}
spfa();
//printf("123\n");
int minn=0x3f3f3f3f;
for(int i=0;i<d;i++)
{
scanf("%d",&a);
minn=min(minn,dis[a]);
}
printf("%d\n",minn);
}
return 0;
}