hdu 2066 一个人的旅行 最短路spfa

来源:互联网 发布:unity3d在线教程 编辑:程序博客网 时间:2024/06/05 05:49

题意:从S个点出发到D个点的最短路。

建一个超级源点与S个点相连,距离为0,建一个超级汇点与D个点相连,距离为0。然后计算最短路。

#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#define N 1100#define INF 0x7ffffffusing namespace std;int v[N],d[N],mp[N][N],n,s[N],t[N];int spfa(int S,int D){    for(int i=1;i<=n;i++)        d[i]=INF,v[i]=0;    queue<int> q;    for(int i=0;i<S;i++)    {        v[s[i]]=1;        d[s[i]]=0;        q.push(s[i]);    }    while(!q.empty())    {        int c=q.front();        q.pop();        v[c]=0;        for(int i=1;i<=n;i++)        {            if(d[i]>d[c]+mp[c][i])            {                d[i]=d[c]+mp[c][i];                if(!v[i])   v[i]=1,q.push(i);            }        }    }    int ans=INF;    for(int i=0;i<D;i++)    ans=min(ans,d[t[i]]);    return ans;}int main(){    int m,S,D;    while(~scanf("%d%d%d",&m,&S,&D))    {        for(int i=0;i<N;i++)            for(int j=0;j<N;j++)                mp[i][j]=INF;        n=0;        for(int i=0;i<m;i++)        {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            n=max(n,max(a,b));            if(c<mp[a][b])  mp[a][b]=mp[b][a]=c;        }        for(int i=0;i<S;i++)    scanf("%d",&s[i]);        for(int i=0;i<D;i++)    scanf("%d",&t[i]);        cout<<spfa(S,D)<<endl;    }}

0 0
原创粉丝点击