题意就是给你n个起点,一个重点,问从起点到终点最小的花费是多少= =
首先这题是有向图,然后我们把起点看成是终点,终点看成起点。然后用迪杰斯特拉算法求最短路。然后因为我们把终点和起点换了,所以我们建图的时候本来是x->y,要写成y->x
#include<stdio.h> #include<string.h> #include<queue> #include<vector> #include<iostream> #include<algorithm> using namespace std; const int maxn=2*50000; #define inf 99999999 struct node { int v; int w; int next; }V[maxn]; int head[maxn]; int d[maxn]; int n; int tol; int done[maxn]; typedef pair<int,int>pii; priority_queue<pii,vector<pii>,greater<pii> >q; void init() { tol=0; memset(head,-1,sizeof(head)); } void dijk(int s) { while(!q.empty()) q.pop(); memset(done,0,sizeof(done)); for(int i=1;i<=n;i++) d[i]=inf; d[s]=0; q.push(make_pair(d[s],s)); while(!q.empty()) { pii u=q.top(); q.pop(); int x=u.second; if(done[x]) continue; done[x]=1; for(int e=head[x];e!=-1;e=V[e].next) { int v=V[e].v; int w=V[e].w; if(d[x]+w<d[v]) { d[v]=d[x]+w; q.push(make_pair(d[v],v)); } } } } void add(int u,int v,int w) { V[tol].v=v; V[tol].w=w; V[tol].next=head[u]; head[u]=tol++; } int main() { int m,s; while(scanf("%d %d %d",&n,&m,&s)!=EOF) { init(); int x,y,z; while(m--) { scanf("%d %d %d",&x,&y,&z); add(y,x,z); } dijk(s); int num,ans=inf; bool flag=0; scanf("%d",&num); int id; while(num--) { scanf("%d",&id); if(d[id]<ans) { flag=1; ans=d[id]; } } if(flag) printf("%d ",ans); else printf("-1 "); } return 0; }