先将多个起点用一个超级源点连接 ,权值为0
然后用dijkstra就可以得到结果了
#include<iostream>
using namespace std;
#define INF 100000000
int mp[1010][1010],dist[1010];
bool visit[1010];
int main()
{
int N,M,S,T,x,y,c,i,j;
while(scanf("%d%d%d",&N,&M,&T)!=EOF)
{
for(i=0;i<=N;i++)
for(j=0;j<=N;j++)
mp[i][j]=INF;
for(i=1;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&c);
if(mp[x][y]>c) //有多种情况
mp[x][y]=c;
}
int w;
scanf("%d",&w); //w个起点s
for(i=1;i<=w;i++)
{
scanf("%d",&S);
mp[0][S]=0;
}
memset(visit,0,sizeof(visit)); visit[0]=1;
for(i=0;i<=N;i++) dist[i]=mp[0][i];
dist[0]=0;
// for(i=0;i<=N;i++)
// printf("dist[%d]=%d ",i,dist[i]);
// printf("\n");
int min,k=0;
for(i=0;i<=N;i++)
{
// printf("!N=%d\n",N);
min=INF;
for(j=0;j<=N;j++)
if(!visit[j]&&min>dist[j])
{
min=dist[j];
k=j;
}
// printf("k=%d ",k);
visit[k]=1;
// for(j=0;j<=N;j++) printf("%d ",visit[j]); printf("\n");
for(j=0;j<=N;j++)
if(!visit[j]&&dist[j]>dist[k]+mp[k][j])
dist[j]=dist[k]+mp[k][j];
// for(j=0;j<=N;j++)
// printf("dist[%d]=%d ",j,dist[j]);
// printf("\n");
}
// for(i=0;i<=N;i++)
// printf("dist[%d]=%d ",i,dist[i]);
// printf("\n");
if(dist[T]==INF)
printf("-1\n");
else
printf("%d\n",dist[T]);
}
return 0;
}
本来写的是floyd,这题超时
代码如下
//floyd超时
#include<iostream>
using namespace std;
#define INF 100000000
int N,M,S,T;
int mp[1010][1010];
int main()
{
int i,j,k,x,y,c,w,min;
while(scanf("%d%d%d",&N,&M,&T)!=EOF)
{
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
mp[i][j]=INF;
for(i=1;i<=M;i++)
{
scanf("%d%d%d",&x,&y,&c);
if(mp[x][y]>c)
mp[x][y]=c;
}
//printf("%d %d %d \n",mp[1][4],mp[2][4],mp[3][4]);
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
for(k=1;k<=N;k++)
{
if(mp[i][j]>mp[i][k]+mp[k][j])
mp[i][j]=mp[i][k]+mp[k][j];
}
scanf("%d",&w);
min=INF;
for(i=1;i<=w;i++)
{
scanf("%d",&S);
if(min>mp[S][T])
min=mp[S][T];
}
if(min>=INF)
printf("-1\n");
else
printf("%d\n",min);
}
return 0;
}