hdu 2992 Hotel booking

http://acm.hdu.edu.cn/showproblem.php?pid=2992

  1 #include <cstdio>

  2 #include <cstring>

  3 #include <map>

  4 #include <vector>

  5 #include <queue>

  6 #define maxn 200

  7 #include <algorithm>

  8 using namespace std;

  9 

 10 const int inf=0x3fffffff;

 11 

 12 struct node

 13 {

 14     int v,cost;

 15 };

 16 int g[maxn][maxn],a[maxn],dis[20000];

 17 int n,m,k;

 18 map<int,int>q;

 19 vector<node>v[20000];

 20 bool vis[20000];

 21 int que[20000];

 22 

 23 void inti()

 24 {

 25     q.clear();

 26     for(int i=0; i<=n; i++)

 27     {

 28         v[i].clear();

 29     }

 30     for(int i=0; i<=m+2; i++)

 31     {

 32         for(int j=0; j<=m+2; j++)

 33         {

 34             g[i][j]=inf;

 35             if(i==j) g[i][j]=0;

 36         }

 37     }

 38 }

 39 

 40 void spfa(int qr)

 41 {

 42     queue<int>qq;

 43     memset(vis,false,sizeof(vis));

 44     for(int i=1; i<=n; i++) dis[i]=inf;

 45     dis[qr]=0;

 46     qq.push(qr);

 47     vis[qr]=true;

 48     while(!qq.empty())

 49     {

 50         int x=qq.front();

 51         qq.pop();

 52         vis[x]=false;

 53         for(int i=0; i<(int)v[x].size(); i++)

 54         {

 55             int v2=v[x][i].v,cost=v[x][i].cost;

 56             if(dis[v2]>dis[x]+cost)

 57             {

 58                 dis[v2]=dis[x]+cost;

 59                 if(!vis[v2])

 60                 {

 61                     vis[v2]=true;

 62                     qq.push(v2);

 63                 }

 64             }

 65         }

 66     }

 67     for(int i=1; i<=n; i++)

 68     {

 69         if(dis[i]<=600&&q[i]!=0)

 70         {

 71             g[q[qr]][q[i]]=1;

 72         }

 73     }

 74 

 75 }

 76 

 77 void floyd()

 78 {

 79     for(int c=0; c<=m+1; c++)

 80     {

 81         for(int i=0; i<=m+1; i++)

 82         {

 83             for(int j=0; j<=m+1; j++)

 84             {

 85                     g[i][j]=min(g[i][j],g[i][c]+g[c][j]);

 86             }

 87         }

 88     }

 89 }

 90 int main()

 91 {

 92     while(scanf("%d",&n)!=EOF)

 93     {

 94         if(n==0) break;

 95         scanf("%d",&m);

 96         inti();

 97         for(int i=1; i<=m; i++)

 98         {

 99             scanf("%d",&a[i]);

100             q[a[i]]=i;

101         }

102         a[0]=1;

103         q[1]=0;

104         a[m+1]=n;

105         q[n]=m+1;

106         scanf("%d",&k);

107         for(int i=0; i<k; i++)

108         {

109             int u,v1,cost;

110             scanf("%d%d%d",&u,&v1,&cost);

111             node st;

112             st.v=v1;

113             st.cost=cost;

114             node st1;

115             st1.v=u;

116             st1.cost=cost;

117             v[u].push_back(st);

118             v[v1].push_back(st1);

119         }

120         for(int i=0; i<=m; i++)

121         {

122             spfa(a[i]);

123         }

124         floyd();

125         if(g[0][m+1]==inf)

126         {

127             printf("-1\n");

128         }

129         else

130             printf("%d\n",g[0][m+1]-1);

131     }

132     return 0;

133 }
View Code

 

你可能感兴趣的:(HDU)