hdoj 2066 一个人的旅行

来源:互联网 发布:淘宝hd无法登陆 编辑:程序博客网 时间:2024/05/17 04:23

11页竟然有图论题。。。
一遍dijkstra就可以,可以把家看成0城市,与家相邻的城市和家的连边权都是0,跑一遍dijkstra比较一波即可。
比较烦人的是要注意这里没给城市数,城市的编号也不是连续的。。。

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#define INF 0x3f3f3fusing namespace std;int T,S,D,n,ans,mp[1010][1010],dis[1010],a[1010];bool vis[1010];void dij(){    memset(vis,0,sizeof(vis));    memset(dis,INF,sizeof(dis));    for(int i=1;i<=n;i++)        dis[a[i]]=mp[0][a[i]];    dis[0]=0;    vis[0]=1;    for(int i=0;i<=n;i++)    {        int tmp=INF,tj;        for(int j=0;j<=n;j++)        {            if(dis[a[j]]<tmp&&!vis[a[j]])            {                tmp=dis[a[j]];                tj=a[j];            }        }        vis[tj]=1;        for(int j=0;j<=n;j++)        {            if(!vis[a[j]])            dis[a[j]]=min(dis[a[j]],dis[tj]+mp[tj][a[j]]);        }    }}int main(){    while(scanf("%d%d%d",&T,&S,&D)!=EOF)    {        n=0;ans=INF;        memset(mp,INF,sizeof(mp));        memset(vis,0,sizeof(vis));        for(int i=1;i<=T;i++)        {            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            if(mp[x][y]>z){mp[x][y]=z;mp[y][x]=z;}            if(!vis[x]){vis[x]=1;a[++n]=x;}            if(!vis[y]){vis[y]=1;a[++n]=y;}        }        for(int i=1;i<=S;i++)        {            int x;            scanf("%d",&x);            mp[0][x]=0;mp[x][0]=0;        }        dij();        for(int i=1;i<=D;i++)        {            int x;            scanf("%d",&x);            if(dis[x]<ans)                ans=dis[x];        }        printf("%d\n",ans);    }    return 0;}