HDU 2066 一个人的旅行

来源:互联网 发布:时代光华 知乎 编辑:程序博客网 时间:2024/05/13 11:19

转载请注明出处:http://blog.csdn.net/a1dark

分析:暴力枚举起点和终点、本来一道秒杀的水题、本不想水的、但是想想还是水一下、不水不要紧、一水吓一跳、memset把我坑惨了、原来只能用memset定义0而不能定义其他数据、切记切记!

#include<stdio.h>#include<queue>#include<algorithm>using namespace std;#include<string.h>#define INF 0x7fffffff#define N 1005int map1[N][N];int dist[N];int vis[N];int st[N];int ed[N];int maxx;int spfa(int s,int e){    memset(vis,0,sizeof(vis));    for(int i=0;i<=maxx;i++)        dist[i]=INF;    queue<int >q;    dist[s]=0;    q.push(s);    vis[s]=1;    while(!q.empty()){        int now=q.front();        q.pop();        vis[now]=0;        for(int i=1;i<=maxx;i++){            if(map1[now][i]!=INF&&(map1[now][i]+dist[now]<dist[i])){                dist[i]=map1[now][i]+dist[now];                if(!vis[i]){                    q.push(i);                    vis[i]=1;                }            }        }    }    return dist[e];}void init(){    for(int i=0;i<N;i++)        for(int j=0;j<N;j++){            if(i==j)map1[i][j]=0;            else map1[i][j]=INF;        }}int main(){    int T,S,D;    while(scanf("%d%d%d",&T,&S,&D)!=EOF){        init();        maxx=1;        int s,e,v;        for(int i=1;i<=T;i++){            scanf("%d%d%d",&s,&e,&v);            if(v<map1[s][e]){                map1[s][e]=v;            }            if(v<map1[e][s]){                map1[e][s]=v;            }            if(maxx<s)maxx=s;            if(maxx<e)maxx=e;        }        for(int i=1;i<=S;i++)            scanf("%d",&st[i]);        for(int i=1;i<=D;i++)            scanf("%d",&ed[i]);        int min=INF;        for(int i=1;i<=S;i++){            for(int j=1;j<=D;j++){                if(min>spfa(st[i],ed[j]))                    min=spfa(st[i],ed[j]);            }        }        printf("%d\n",min);    }    return 0;}


原创粉丝点击