hdu 2680 Choose the best route

多个起点,一个终点,求最短路,额,一开始三种SPFA都试了一下,用队列实现,用栈实现,唉,都悲剧的TLE了,怎么就没想到呢,把终点变成起点,就只需要调用一次SPFA了,而且,最后在遍历一下,找出路径最短的原先的起点,

#include<iostream> 
#include<queue>
#define MAXINT 9999999  
#define MAXN 1010  
using namespace std;  
int vis[MAXN],dis[MAXN],n,num,m;  
int root[MAXN],cou[MAXN]; 
struct edge  
{  
    int u,w,next;  
}e[MAXN*20];  
bool spfa(int s)  
{  
    for(int i=1;i<=n;i++)  
        dis[i]=MAXINT;  
    dis[s]=0;  
    memset(vis,0,sizeof(vis));  
    memset(cou,0,sizeof(cou));  
    vis[s]=cou[s]=1;  
	queue<int> Q;
	Q.push(s);
    while(!Q.empty())  
    {  
		int t=Q.front(),k;  
         vis[t]=0;  
		 Q.pop();
        for(int j=root[t];j!=-1;j=e[j].next)  
        {  
            k=e[j].u;  
            if(dis[k]>e[j].w+dis[t])  
            {  
                dis[k]=e[j].w+dis[t];  
                if(!vis[k])  
                {  
                    vis[k]=1;  
					Q.push(k);
                    cou[k]++;  
                    if(cou[k]>n) return 0;  
                }  
            }  
        }  
    }  
    return 1;  
}  
int main()  
{  
    int a,b,c,cas,max1; 
	int en;
    while(cin>>n>>m>>en)
	{
	  num=0; 
	  max1=MAXINT; 
      memset(root,-1,sizeof(root));  
      for(int i=0;i<m;i++)  
      {  
        scanf("%d %d %d",&a,&b,&c);  
        e[num].u=a;  
        e[num].w=c;  
        e[num].next=root[b];  
        root[b]=num++;  
      } 
	  spfa(en);
	  cin>>cas;
	  for(int i=0;i<cas;i++)
	  {
		  scanf("%d",&a);
          if(dis[a]<max1)  
			  max1=dis[a];
	   }   
	  if(max1<MAXINT)
	  cout<<max1<<endl;  
	  else cout<<-1<<endl;
	}
	return 0;
}  
原文地址:https://www.cnblogs.com/nanke/p/2138041.html