HDU 2680

来源:互联网 发布:多个相同表格数据提取 编辑:程序博客网 时间:2024/04/30 15:19

这是一道最短路,求多点之间的距离,我一开始用的是Floyd,但发现超时了,后来看了大牛的博客才发现一种新的方法,就是设出一个虚点,使这个虚点到要开始点的距离都为0,然后用Dijkstra,具体看代码!#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn=1005;int map[maxn][maxn];bool p[maxn];int dist[maxn];const int inf=0x3f3f3f3f;int n,m,s;void init(){    int i,j;    for(i=0; i<=n; i++)    {        for(j=0; j<=n; j++)        {            map[i][j]=inf;        }    }}void Dijkstra(){    int i,j,pos,min;    for(i=0; i<=n; i++)    {        p[i]=false;        dist[i]=map[0][i];    }    p[0]=true;    dist[0]=0;    for(i=0; i<=n; i++)    {        min=inf;        for(j=0; j<=n; j++)        {            if(!p[j]&&dist[j]<min)            {                min=dist[j];                pos=j;            }        }        p[pos]=true;        for(j=0; j<=n; j++)        {            if(!p[j]&&dist[j]>dist[pos]+map[pos][j])                dist[j]=dist[pos]+map[pos][j];        }    }}int main(){    int i;    while(scanf("%d%d%d",&n,&m,&s)!=EOF)    {        init();        for(i=1; i<=m; i++)        {            int p,q,t;            scanf("%d%d%d",&p,&q,&t);            if(map[p][q]>t)              map[p][q]=t;        }        int a;        scanf("%d",&a);        for(i=1; i<=a; i++)        {            int b;            scanf("%d",&b);            map[0][b]=0;        }        Dijkstra();        if(dist[s]==inf)            printf("-1\n");        else            printf("%d\n",dist[s]);    }    return 0;}


原创粉丝点击