HDU 2066 一个人的旅行

来源:互联网 发布:caj文件打开软件 编辑:程序博客网 时间:2024/06/03 21:53

题目链接

题意:中文题。。。

分析:floyd算法,删减dp[i][k] inf的边 优化避免超时

#include<cstdio>#include<cstring>#include<algorithm>#define inf 0x3f3f3f3f#define N 1001using namespace std;int dp[N][N];int dd[N];void floyd(int n){    for(int k=0;k<=n;k++)    {        for(int i=0;i<=n;i++)        {            if(dp[i][k]!=inf)            {                for(int j=0;j<=n;j++)                {                    dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);                }            }        }    }}int main(void){    int t,s,d;    while(scanf("%d%d%d",&t,&s,&d)==3)    {        for(int i=0;i<N;i++)        {            dp[i][i]=0;            for(int j=i+1;j<N;j++)            dp[i][j]=dp[j][i]=inf;        }        memset(dd, 0, sizeof(dd));        int num=0;         for(int i=1;i<=t;i++)        {            int a,b,t;            scanf("%d%d%d",&a,&b,&t);            num=max(a,num);            num=max(b,num);            dp[a][b]=min(dp[a][b],t);            dp[b][a]=t;        }        for(int i=1;i<=s;i++)        {            int ss;            scanf("%d",&ss);            dp[0][ss]=0;            dp[ss][0]=0;        }        for(int i=1;i<=d;i++)        scanf("%d",&dd[i]);        floyd(num);        int res=inf;        for(int i=1;i<=d;i++)        {            if(dp[0][dd[i]]<res)            {                res=dp[0][dd[i]];            }        }        printf("%d\n",res);    }    return 0;}
0 0
原创粉丝点击