题目来源http://acm.hdu.cn/php?pid=2680
题意
A要去S,有w个起点,求最短路。
思路
定义一个超级源点,到达这些起点的的权值均为0,然后进行最短路。
代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int INF=0x3f3f3f3f;
int d[1000+10];
int w[1000+10][1000+10];
bool vis[1000+10];
int n,m,s;
void dijs()
{
d[0]=0;
memset(vis,0,sizeof(vis));
for(int i=0; i<=n; i++)
{
int maxx=INF,pos=-1;
for(int j=0; j<=n; j++)
{
if(!vis[j]&&d[j]<maxx)
{
maxx=d[pos=j];
}
}
if(pos==-1) break;
vis[pos]=1;
for(int j=0; j<=n; j++)
{
if(d[j]>d[pos]+w[pos][j])
{
d[j]=d[pos]+w[pos][j];
}
}
}
if(d[s]!=INF) printf("%d\n",d[s]);
else printf("-1\n");
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&s))
{
for(int i=0; i<=n; i++)
{
d[i]=INF;
for(int j=0; j<=n; j++)
{
w[i][j]=i==j?0:INF;
}
}
for(int i=1; i<=m; i++)
{
int u,v,z;
scanf("%d%d%d",&u,&v,&z);
w[u][v]=w[u][v]>z?z:w[u][v];
}
int num;
scanf("%d",&num);
for(int i=1; i<=num; i++)
{
int sta;
scanf("%d",&sta);
w[0][sta]=0;
}
dijs();
}
}