hdu-2066-最短路程问题

来源:互联网 发布:nba2konline辅助软件 编辑:程序博客网 时间:2024/05/28 23:09

起点成市有多个,抵达城市也有多个,问当中最最最短的是哪一条。每一种情况都得考虑,有n*m种情况。这是加强版的最短路径问题。题目不难,需要耐心。

以下是AC代码,没怎么优化。请耐心看。

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define MAX 1005#define inf 99999int len,e;int map[MAX][MAX],ee[MAX];int dis[MAX],flag[MAX];int dj(int str)//以下是模板,不用多解释{    int i,j,v,minx;    //memset(flag,0,sizeof(flag));    for(i=1; i<=len; i++)    {        flag[i]=0;        dis[i]=map[str][i];    }    dis[str]=0;    flag[str]=1;    for(i=1; i<=len; i++)    {        minx=inf;        for(j=1; j<=len; j++)        {            if(!flag[j]&&dis[j]<minx)            {                minx=dis[j];                v=j;            }        }        flag[v]=1;        if(minx==inf)break;        for(j=1; j<=len; j++)        {            if(!flag[j]&&dis[j]>dis[v]+map[v][j])                dis[j]=dis[v]+map[v][j];        }    }    minx=inf;    for(i=1; i<=e; i++)//起始城市到每个想去城市的最短距离,找出最小的    {        if(minx>dis[ee[i]])            minx=dis[ee[i]];    }    return minx;}int main(){    int t,s,i,j,a,b,time,ans,minx;    int ss[MAX];    while(scanf("%d%d%d",&t,&s,&e)!=EOF)    {        for(i=1; i<=MAX; i++)            for(j=1; j<=MAX; j++)                map[i][j]=inf;        len=0;//记录城市的长度(最大是几号城市)        while(t--)        {            scanf("%d%d%d",&a,&b,&time);            if(map[a][b]>time)                map[a][b]=map[b][a]=time;            if(len<a)len=a;            if(len<b)len=b;        }        for(i=1; i<=s; i++)            scanf("%d",&ss[i]);        for(i=1; i<=e; i++)            scanf("%d",&ee[i]);        ans=inf;        for(i=1; i<=s; i++)//列举每一个起始城市        {            minx=dj(ss[i])            if(ans>minx)                ans=minx;        }        cout<<ans<<endl;    }    return 0;}


原创粉丝点击