六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 35|回复: 0

【枚举+最短路】HDU 2363 Cycling

[复制链接]

升级  68.4%

272

主题

272

主题

272

主题

进士

Rank: 4

积分
842
 楼主| 发表于 2013-1-26 12:34:49 | 显示全部楼层 |阅读模式
http://acm.hdu.edu.cn/showproblem.php?pid=2363

题意:求最小高度差下的最短路

#include <iostream>#include <fstream>#include <algorithm>#include <string>#include <set>//#include <map>#include <queue>#include <utility>#include <iomanip>#include <stack>#include <list>#include <vector>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>//#include <ctime>#include <ctype.h>using namespace std;#define LL __int64#define inf 0x3fffffff#define M 105struct xxx{    int high;    int low;}x[10005];struct son{    int v;    int w;};vector<son> g[M];int dist[M], n, H[M];bool inq[M];bool cmp (xxx a, xxx b){    return (a.high - a.low) < (b.high - b.low);}void spfa (int low, int high){    int i, v, w, u = 1;    for (i = 1; i <= n; i++)    {        dist = inf;        inq = false;    }    queue<int> q;    q.push (u);    dist = 0;    inq = true;    while (!q.empty())    {        u = q.front();        q.pop();        inq = false;        if (H < low || H > high)    //起点也要限制            continue;        for (i = 0; i < g.size(); i++)        {            v = g.v;            if (H[v] < low || H[v] > high)    //高度的限制                continue;            w = g.w;            if (dist + w < dist[v])            {                dist[v] = dist + w;                if (!inq[v])                {                    q.push (v);                    inq[v] = true;                }            }        }    }}int main(){    int t, m, u, v, w, i, j, k;    son s;    scanf ("%d", &t);    while (t--)    {        scanf ("%d%d", &n, &m);        for (i = 1; i <= n; i++)        {            scanf ("%d", H+i);            g.clear();        }        k = 0;        for (i = 1; i <= n; i++)        {            for (j = i; j <= n; j++)    //不能写成j=i+1,想想起点=终点的情况            {                x[k].low = min (H, H[j]);                x[k++].high = max (H, H[j]);            }        }        while (m--)        {            scanf ("%d%d%d", &u, &v, &w);            s.v = v;            s.w = w;            g.push_back (s);            s.v = u;            g[v].push_back (s);        }        sort (x, x+k, cmp);        //按差排序        for (i = 0; i < k; i++)    //差从小到大暴力枚举        {            spfa (x.low, x.high);            if (dist[n] != inf)    //一旦可到达,立刻得出答案                break;        }        printf ("%d %d\n", x.high-x.low, dist[n]);    }    return 0;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表