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;
}

浙公网安备 33010602011771号