HDU - 2145 zz's Mysterious Present (最短路)

题目大意:有一个人,办了一个party,先到的有礼物。如果有多个人同时到达,就去家离得最远的那个,如果还是多个人同时到达,就去那个编号最大的

解题思路:最短路水题。。。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
#define N 310
#define INF 0x3f3f3f3f

struct People {
    int len, id, start, speed;
    double time;
}P[N];

int dis[N][N], d[N];
int n, m, k, zz;
bool vis[N];

int cmp(People a, People b) {
    if (fabs(a.time - b.time) < 1e-7) {
        if (a.len == b.len) {
            return a.id > b.id;
        }
        else
            return a.len > b.len;
    }
    else
        return a.time < b.time;

}

void init() {

    memset(dis, 0x3f, sizeof(dis));
    for (int i = 1; i <= n; i++)
        dis[i][i] = 0;

    int x, y, z;
    for (int i = 0; i < k; i++) {
        scanf("%d%d%d", &x, &y, &z);
        dis[y][x] = min(dis[y][x], z);
    }
    scanf("%d", &zz);

    for (int i = 1; i <= m; i++) {
        scanf("%d", &P[i].start);
    }
    for (int i = 1; i <= m; i++) {
        scanf("%d", &P[i].speed);
    }
}

void Dijkstra() {
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= n; i++)
        d[i] = dis[zz][i];
    vis[zz] = 1;
    d[zz] = 0;

    for (int i = 2; i <= n; i++) {
        int x, t = INF;
        for (int j = 1; j <= n; j++)
            if (!vis[j] && d[j] < t) {
                t = d[j];
                x = j;
            }
        if (t == INF)
            break;
        vis[x] = 1;
        for (int j = 1; j <= n; j++) {
            if (d[j] > d[x] + dis[x][j]) {
                d[j] = d[x] + dis[x][j];
            }
        }
    }
}

void solve() {
    Dijkstra();

    for (int i = 1; i <= m; i++) {
        if (d[P[i].start] == INF) {
            P[i].time = INF;
            P[i].len = INF;
            P[i].id = i;
        }
        else {
            P[i].time = d[P[i].start] * 1.0 / P[i].speed;
            P[i].len = d[P[i].start];
            P[i].id = i;
        }
    }
    sort(P + 1, P + m + 1, cmp);
    if (P[1].time == INF)
        printf("No one\n");
    else
        printf("%d\n", P[1].id);

}

int main() {
    while (scanf("%d%d%d", &n, &m, &k) != EOF) {
        init();
        solve();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU - 2145 zz's Mysterious Present (最短路)

时间: 2024-10-11 00:42:05

HDU - 2145 zz's Mysterious Present (最短路)的相关文章

HDU 1596 find the safest road (最短路)

find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6973    Accepted Submission(s): 2469 Problem Description XX星球有很多城市,每个城市之间有一条或多条飞行通道,但是并不是所有的路都是很安全的,每一条路有一个安全系数s,s是在 0 和 1

codeforces4D - Mysterious Present DP

题意:求限定起始位置的二维最长递增子序列. 解题思路:直接DP 解题代码: 1 // File Name: 4d.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月04日 星期一 19时24分49秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #incl

HDU 4063 线段与圆相交+最短路

Aircraft Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 980    Accepted Submission(s): 228 Problem Description You are playing a flying game. In the game, player controls an aircraft in a 2D-

HDU 2066-一个人的旅行(最短路Dijkstra)

一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19349    Accepted Submission(s): 6763 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰

hdu 4885 TIANKENG’s travel (最短路+判断三点共线)

TIANKENG's travel Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 408    Accepted Submission(s): 100 Problem Description TIANKENG has get a driving license and one day he is so lucky to find a

HDU 3416 Marriage Match IV(最短路+网络流之最大流)

题目地址:HDU 3416 这道题WA了一天半...最终才发现是我一直习惯性的将isap的表示上界的变量直接表示成sink+1了...但是在这道题里汇点sink不一定是最后一个点...sad... 这题可以有两种方法做,一种是求两次最短路,d1表示所有点到源点的最短距离,再求一次用d2表示所有点到汇点的最短距离.然后根据公式d1[u]+d2[v]+w==d1[sink]判断是否属于最短路中的一条边. 还有一种是只求一次最短路,直接用d[v]==d[u]+w来判断是否是可以到达源点的最短路,如果可

HDU 1428 漫步校园 特殊的最短路

HDU 1428 漫步校园 特殊的最短路 题意 这里需要读懂题意中的一句话"另外,他考虑从A区域到B区域仅当存在一条从B到机房的路线比任何一条从A到机房的路线更近(否则可能永远都到不了机房了-)." 这句话的意思是从(1, 1)到(n, n)的所有路径中,只选择距离最短的路径,并输出最短路径的条数.就是我们找出最短距离后,看看有多少条路到达目的地是最短距离. 解题思路 从题意我们也就知道了,我们需要找出每个点到目的地的最短路是多少.这里我们最先想到的就是一些最短路的算法了,比如Dijk

hdu 4370 0 or 1 (最短路)

hdu 4370 0 or 1 Description Given a n*n matrix C ij (1<=i,j<=n),We want to find a n*n matrix X ij (1<=i,j<=n),which is 0 or 1. Besides,X ij meets the following conditions: 1.X 12+X 13+-X 1n=1 2.X 1n+X 2n+-X n-1n=1 3.for each i (1 < i < n

Hdu 5521 Meeting(建图+最短路)

题目地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=5521 思路:边数太多,不能直接建图.对于每个集合,设置一个虚拟点,对于每个集合中的点u:连一条u->S权值为0的边(点在集合中,花费为0):连一条S->u权值为w的边(从集合中一点到另一点花费w).分别计算从点1到i和从点n到i的最短路,枚举i,则ans=min( ans,max ( dist[0][i],dist[1][i] ) ). #include<queue> #i