http://acm.hdu.edu.cn/showproblem.php?pid=2680
题目大意:
给你一个有向图,一个起点集合,一个终点,求最短路。
自己多加一个超级源点,把起点集合连接到超级源点上,然后将起点与超级源点的集合的路径长度设为0, 然后求最短路。
#include<cstdio>
#include<iostream>
using namespace std;
#define M 2000000
#define N 1005
int a[N][N],aa[N],n,m,s,w;
void init()
{
int i,j,b,c,h;
for (i=0;i<=n;i++)
for (j=0;j<=n;j++)
a[i][j]=M;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&b,&c,&h);
if (h<a[b][c]) a[b][c]=h;//图论要记得加上这个判断!!
}
scanf("%d",&w);
for (i=1;i<=w;i++)
{
scanf("%d",&b);
a[0][b]=0;
}
}
int main()
{
//freopen("a","r",stdin);
int i,j,k;
while (1)
{
if (scanf("%d%d%d",&n,&m,&s)==EOF) break;
init();
int dis[N];
bool tp[N];
for (i=1;i<=n;i++)
{
dis[i]=a[0][i];
tp[i]=false;
}
int min;
for (i=1;i<=n;i++)
{
min=M;
for (j=1;j<=n;j++)
if (tp[j]==false && dis[j]<min)
{
min=dis[j];
k=j;
}
tp[k]=true;
for (j=1;j<=n;j++)
if (k!=j && tp[j]==false && dis[k]+a[k][j]<dis[j])
dis[j]=dis[k]+a[k][j];
}
if (dis[s]==M) cout<<"-1"<<endl;
else cout<<dis[s]<<endl;
}
return 0;
}