HDU 2992 Hotel booking(BFS+DFS 或者 SPFA+Floyd)

点我看题目

题意 : 一个司机要从1点到达n点,1点到n点中有一些点有宾馆,司机的最长开车时间不能超过10小时,所以要在10小时之内找到宾馆休息,但是为了尽快的走到n点,问最少可以经过几个宾馆。

思路 : 这个题太狠了,简直不是人做的。。。。可以BFS一下,然后在B之前先D一下能走的路。当然也可以用SPFA+Floyd。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
#include <vector> using namespace std ; struct node
{
int u,w ;
}temp ;
struct BFS
{
int u,w,step ;
}t,t1 ;
const int maxn = ;
const int INF = ;
vector<node> vec[maxn] ;
queue<BFS>Q ;
bool hashh[],vis[maxn] ;
int n,m,h ;
int ret[maxn],st[maxn] ; void DFS(int u,int w,int step)
{
if(vis[u]) return ;
if(w >= ret[u]) return ;
if(w > ) ret[u] = w ;
if(hashh[u] && w == ) vis[u] = true ;
for(int i = ; i < vec[u].size() ; i++)
{
if(hashh[vec[u][i].u] && (!vis[vec[u][i].u]) && (w+vec[u][i].w<=) && (step + < st[vec[u][i].u]))
{
t.u = vec[u][i].u ;
//t.w = vec[u][i].w ;
t.step = step+ ;
st[t.u] = t.step ;
Q.push(t) ;
}
if(w+vec[u][i].w <= )
DFS(vec[u][i].u,w+vec[u][i].w,step) ;
}
}
void BFS()
{
while(!Q.empty())
Q.pop() ;
t.u = ;
t.w = t.step = ;
Q.push(t) ;
while(!Q.empty())
{
t1 = Q.front() ;
Q.pop() ;
if(t1.u == n)
{
printf("%d\n",t1.step-) ;
return ;
}
DFS(t1.u,,t1.step) ;
}
printf("-1\n") ;
return ;
}
int main()
{
while(~scanf("%d",&n))
{
if(n == ) break ;
for(int i = ; i <= n ; i++)
{
vector<node>().swap(vec[i]) ;
ret[i] = st[i] = INF ;
hashh[i] = vis[i] = false ;
}
hashh[] = hashh[n] = true ;
scanf("%d",&m) ;
int s ;
for(int i = ; i < m ; i++)
{
scanf("%d",&s) ;
hashh[s] = true ;
}
scanf("%d",&h) ;
int u,v,w ;
for(int i = ; i < h ; i++)
{
scanf("%d %d %d",&u,&v,&w) ;
temp.u = v ;
temp.w = w ;
vec[u].push_back(temp) ;
temp.u = u ;
vec[v].push_back(temp) ;
}
BFS() ;
}
return ;
}
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
#include <queue>
#define maxn 200
#include <algorithm>
using namespace std; const int inf=0x3fffffff; struct node
{
    int v,cost;
};
int g[maxn][maxn],a[maxn],dis[];
int n,m,k;
map<int,int>q;
vector<node>v[];
bool vis[];
int que[]; void inti()
{
    q.clear();
    for(int i=; i<=n; i++)
    {
        v.clear();
    }
    for(int i=; i<=m+; i++)
    {
        for(int j=; j<=m+; j++)
        {
            g[j]=inf;
            if(i==j) g[j]=;
        }
    }
} void spfa(int qr)
{
    queue<int>qq;
    memset(vis,false,sizeof(vis));
    for(int i=; i<=n; i++) dis=inf;
    dis[qr]=;
    qq.push(qr);
    vis[qr]=true;
    while(!qq.empty())
    {
        int x=qq.front();
        qq.pop();
        vis[x]=false;
        for(int i=; i<(int)v[x].size(); i++)
        {
            int v2=v[x].v,cost=v[x].cost;
            if(dis[v2]>dis[x]+cost)
            {
                dis[v2]=dis[x]+cost;
                if(!vis[v2])
                {
                    vis[v2]=true;
                    qq.push(v2);
                }
            }
        }
    }
    for(int i=; i<=n; i++)
    {
        if(dis<=&&q!=)
        {
            g[q[qr]][q]=;
        }
    } } void floyd()
{
    for(int c=; c<=m+; c++)
    {
        for(int i=; i<=m+; i++)
        {
            for(int j=; j<=m+; j++)
            {
                    g[j]=min(g[j],g[c]+g[c][j]);
            }
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        if(n==) break;
        scanf("%d",&m);
        inti();
        for(int i=; i<=m; i++)
        {
            scanf("%d",&a);
            q[a]=i;
        }
        a[]=;
        q[]=;
        a[m+]=n;
        q[n]=m+;
        scanf("%d",&k);
        for(int i=; i<k; i++)
        {
            int u,v1,cost;
            scanf("%d%d%d",&u,&v1,&cost);
            node st;
            st.v=v1;
            st.cost=cost;
            node st1;
            st1.v=u;
            st1.cost=cost;
            v.push_back(st);
            v[v1].push_back(st1);
        }
        for(int i=; i<=m; i++)
        {
            spfa(a);
        }
        floyd();
        if(g[][m+]==inf)
        {
            printf("-1\n");
        }
        else
            printf("%d\n",g[][m+]-);
    }
    return ;
}

二货写的SPFA+Floyd

上一篇:python 简单示例说明os.walk和os.path.walk的不同


下一篇:解决端口耗尽问题: tcp_tw_reuse、tcp_timestamps