hdu2680最短路
本题的意思是求多个源点的最短路,比较简单,可以反过来求,把终点做源点。但是也可以构造一个源点。我用了dijkstra写的
#include <iostream> using namespace std; const int N=1009; struct node { int v,w,next; }e[N*N]; int head[N],vis[N],dis[N]; int n,m,tot; void add(int a,int b,int w) { e[tot].v=b; e[tot].w=w; e[tot].next=head[a]; head[a]=tot++; } void dij(int s) { int i,k=0; memset(vis,0,sizeof(vis)); memset(dis,-1,sizeof(dis)); vis[0]=1; dis[0]=0; while(k!=-1) { if(k==s)break; vis[k]=1; for (i=head[k];i+1;i=e[i].next) { int v=e[i].v; if(dis[v]==-1||(dis[v]>dis[k]+e[i].w)) dis[v]=dis[k]+e[i].w; } k=-1; for(i=1;i<=n;i++) { if(!vis[i]&&dis[i]!=-1) { k=i; break; } } for(i++;i<=n;i++) { if(!vis[i]&&dis[i]!=-1&&dis[i]<dis[k]) k=i; } } } int main() { int i,s,a,b,w,t; while (scanf("%d%d%d",&n,&m,&s)!=EOF) { tot=0; memset(head,-1,sizeof(head)); for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&w); add(a,b,w); } scanf("%d",&t); for(i=0;i<t;i++) { scanf("%d",&a); add(0,a,1); } dij(s); if(dis[s]!=-1) printf("%d\n",dis[s]-1); else printf("%d\n",dis[s]); } return 0; }