题意:给出多个可选择的起始点和终点,求最短路
思路:执行起始点次的spfa即可
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXN 1100 #define MAXM 5000 #define inf 2000000000 struct Edge { int to,next; int time; }edge[MAXM]; int ans,tot; int pre[MAXM],head[MAXM],que[MAXM]; int vis[MAXM],dis[MAXM],tar[MAXN]; void addedge(int u,int v,int c) { edge[tot].to=v; edge[tot].next=head[u]; edge[tot].time=c; head[u]=tot++; edge[tot].to=u; edge[tot].next=head[v]; edge[tot].time=c; head[v]=tot++; } void spfa(int s) { memset(vis,0,sizeof(vis)); for(int i=0;i<MAXN;i++) dis[i]=inf; dis[s]=0; vis[s]=true; int front,rear; front=rear=0; que[rear++]=s; while(front!=rear) { int pre=que[front++]; vis[pre]=true; int v; for(int j=head[pre];j!=-1;j=edge[j].next) { v=edge[j].to; if(dis[v]>dis[pre]+edge[j].time) { dis[v]=dis[pre]+edge[j].time; if(tar[v]==1) { if(dis[v]<ans) ans=dis[v]; } if(!vis[v]) { vis[v]=true; que[rear++]=v; } } } vis[pre]=false; } } void Init() { tot=0; memset(head,-1,sizeof(head)); } int si[MAXN]; int main() { int T,S,D; while(scanf("%d%d%d",&T,&S,&D)!=EOF) { int a,b,c; Init(); ans=inf; for(int i=0;i<T;i++) { scanf("%d%d%d",&a,&b,&c); addedge(a,b,c); } memset(tar,0,sizeof(tar)); for(int i=0;i<S;i++) { scanf("%d",&si[i]); } for(int i=0;i<D;i++) { scanf("%d",&a); tar[a]=1; } for(int i=0;i<S;i++) { spfa(si[i]); } printf("%d ",ans); } return 0; }