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
");
128         }
129         else
130             printf("%d
",g[0][m+1]-1);
131     }
132     return 0;
133 }
View Code
原文地址:https://www.cnblogs.com/fanminghui/p/3634248.html