hdu3665Seaside(水搜索)

题目请戳这里

题目大意:给n个点,每个点与其他点有一些有向边,边权为边长。每个点有一个属性,1表示靠海,otherwise 0。现在从0出发,要到靠近海边的点,求最短距离。

题目分析:最短路。可是10个点的有向图也懒得写最短路了。直接爆搜吧。

比赛的时候准备直接dfs的。男神不知道找了个什么理由非要我写bfs+优先队列优化。。。。。。。

事实证明,这题太水。。。

详情请见代码:

dfs:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N = 15;
const int inf = 0x3f3f3f3f;

int n,m;
int a[N];
int g[N][N];
int ans;

void dfs(int cur,int sum,int dp)
{
    if(dp > n)
        return;
    if(a[cur])
    {
        if(ans > sum)
            ans = sum;
        return;
    }
    if(sum > ans)
        return;
    int i;
    for(i = 0;i < n;i ++)
    {
        if(g[cur][i] < inf)
            dfs(i,sum + g[cur][i],dp + 1);
    }
}
int main()
{
    int i,j,x;
    while(scanf("%d",&n) != EOF)
    {
        memset(g,0x3f,sizeof(g));
        for(i = 0;i < n;i ++)
        {
            scanf("%d%d",&m,&a[i]);
            while(m --)
            {
                scanf("%d%d",&j,&x);
                g[i][j] = min(g[i][j],x);
            }
        }
        ans = inf;
        dfs(0,0,1);
        printf("%d\n",ans);
    }
    return 0;
}

bfs:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 15;
const int inf = 0x3f3f3f3f;

struct node
{
    int id;
    ll dis;

}s,now;
bool operator <(const node &a,const node &b)
{
    return a.dis >b.dis;
}
int a[N];
priority_queue<node>lcm;
int n;
ll g[N][N];
ll Bfs()
{
    int i;
    s.id = 0;
    s.dis = 0;
    while(!lcm.empty())
        lcm.pop();
    lcm.push(s);
    while(!lcm.empty())
    {
        now = lcm.top();
        lcm.pop();
        if(a[now.id])
            return now.dis;
        for(i = 0;i < n;i ++)
        {
            if(g[now.id][i] < inf)
            {
                s.id = i;
                s.dis = now.dis + g[now.id][i];
                lcm.push(s);
            }
        }
    }
    return -1;
}
int main()
{
    int i,j,m;
    while(scanf("%d",&n) != EOF)
    {
        for(i = 0;i <= n;i ++)
            for(j = 0;j <= n;j ++)
                g[i][j] = inf;
        for(i = 0;i < n;i ++)
        {
            scanf("%d%d",&m,&a[i]);
            while(m --)
            {
                int ta;
                ll td;
                scanf("%d%I64d",&ta,&td);
                g[i][ta] = min(g[i][ta],td);
            }
        }
        printf("%I64d\n",Bfs());
    }
    return 0;
}


你可能感兴趣的:(搜索)