HDU 5521 Meeting

每个点向他所在集合连一条权为0的边,每个集合向他里面所有点连一条权为c的边,跑最短路就行了.

#include <bits/stdc++.h>
using namespace std;
#define prt(k) cerr<<#k" = "<<k<<endl
typedef long long LL;
//const int inf = 0x3f3f3f3f;
const int M = 2000100;
const LL inf = 0x3f3f3f3f3f3f3f3fLL;
struct Edge
{
    int v;
    int w;
    int nxt;
    Edge() {}
    Edge(int vv, int ww, int Nxt = -1) { v = vv , w = ww, nxt = Nxt; }
} e[M << 2];
int head[M], mm;
void initEdge() { mm = 0; memset(head, -1, sizeof head); }
void adde(int u, int v, int w)
{
    swap(u, v);
    e[mm] = Edge(v, w, head[u]);
    head[u] = mm ++;
}
vector<int> g[M];
int n, m;
LL d1[ M], d2[ M];
struct Heap
{
    LL d; int u;
    Heap() {}
    Heap(LL dd, int uu) { d = dd, u = uu; }
    bool operator < (const Heap& rhs) const {
        return d > rhs.d;
    }
};
bool done[M];
void Dij(int src, LL d[])
{
    priority_queue<Heap> Q;
    memset(d, 0x3f, sizeof d);
    for (auto x: g[src]) {
        d[x + n] = 0;
        Q.push(Heap(0, x + n));
    }
    Q.push(Heap(0, src));
    d[src] = 0;
    memset(done, false, sizeof done);
    while (!Q.empty()) {
        Heap x = Q.top(); Q.pop();
        int u = x.u;
        if (done[u]) continue;
        done[u] = true;
        for (int i=head[u];~i;i=e[i].nxt) {
            LL w = e[i].w;
            int v = e[i].v;
            if (d[v] > d[u] + w) {
                d[v] = d[u] + w;
                Q.push(Heap(d[v], v));
            }
        }
    }
}
int main()
{
    int re, ca=1; scanf("%d", &re);
    while (re-- ) {
        scanf("%d%d", &n, &m);
        initEdge();
        for (int i=1;i<=n;i++) g[i].clear();
        for (int i=1;i<=m;i++) {
            int cost, k;
            scanf("%d%d", &cost, &k);
            while (k -- ) {
                int x; scanf("%d", &x);
                adde(i + n, x, cost);
                g[x].push_back(i);
            }
        }
        for (int i=1;i<=n;i++) for (int j : g[i])
            adde(i, j+n, 0);
        memset(d1, 0x3f, sizeof d1);
        memset(d2, 0x3f, sizeof d2);
        Dij(1, d1);
        Dij(n, d2);
        LL ans = inf;
        for (int i=1;i<=n;i++) {
            ans = min(ans, max(d1[i], d2[i]));
        }
        vector<int> vec;
        printf("Case #%d: ", ca++);
        if (ans >= inf) { puts("Evil John"); continue; }
        printf("%I64d\n", ans);
        for (int i=1;i<=n;i++) if (ans == max(d1[i], d2[i])) {
            vec.push_back(i);
        }
        for (int i=0;i<vec.size();i++)
            printf("%d%c", vec[i], i==vec.size()-1 ? 10 : ‘ ‘);
    }
}

  

时间: 2025-01-01 23:19:48

HDU 5521 Meeting的相关文章

HDU 5521 Meeting(虚拟节点+最短路)

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1358    Accepted Submission(s): 435 Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Jo

HDU 5521.Meeting 最短路模板题

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 3361    Accepted Submission(s): 1073 Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Jo

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

hdu 5521 Meeting(最短路)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 题意:有1-n共n个点,给出m个块(完全图),并知道块内各点之间互相到达花费时间均为ti.已知两人分别在点1和点n,求在哪些点相遇能使得花费时间最短.题解:显然先想到从点1和点n分别求最短路,然后枚举点找出哪些点是相遇花费时间最少的.但是这题边太多了,假设一个完全图里有x个点,那边就有x*(x-1)/2条了,必须化简其边.一个可行的办法是给每个完全图增加两个点,分别为入点和出点,入点向其中的点

HDU 5521 Meeting(好题,最短路,2015ACM/ICPC亚洲区沈阳站)

1 /** 2 题意:有n个点,m个集合 3 集合内的点 两两 到的时间为 ti; 4 有两个人 在1,n; 输出最小相遇时间,以及哪些点(可以走走停停); 5 6 思路:****将集合抽象为点.访问过的集合不再访问. 7 Set集合抽象的点. 8 Belong属于哪个集合. 9 */ 10 #include<bits/stdc++.h> 11 using namespace std; 12 typedef long long ll; 13 const ll INF = 0x7f7f7f7f;

hdu 5521 最短路

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1656    Accepted Submission(s): 515 Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Joh

HDU 4311 Meeting point-1 &amp;&amp; HDU 4312 Meeting point-2

这俩个题  题意::给出N(<1e5)个点求找到一个点作为聚会的地方,使每个点到达这里的距离最小.4311是 曼哈顿距离 4312是 切比雪夫距离: 曼哈顿距离 :大家都知道 对于二维坐标系a(xa,yb),b(xb,yb)的曼哈顿距离是abs(xa-xb)+abs(ya-yb): 看的出来这个距离和x,y 都有关,但是X,Y并不相互影响,所以可以分开计算这样,分开计算的好处如下: 如果 只给一个维度的坐标系 ,我们是不可以再什么养的复杂度的时间内处理出来呢? 大难还是很好想的先排序一下,会发现

【hdu 5521】【 2015ACM/ICPC亚洲区沈阳站重现赛】Meeting 题意&题解&代码

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5521 题意: 输入:输入n表示有n个点,输入m表示有m个点集. 接下来m行信息,每行先输入一个t表示这个点集中任意两点费时为t,再输入一个s,表示有s个点在这个点集中,接下来s个数表示这些数在这个点集之中. 现在有两个人,其中一个人住在点1,另一个人住在点n,如果两个人要见面,同时出发,可以走走停停,问需要最少时间是多少,有哪几个点能被当成见面点. 题解: 我们发现这道题如果建好图之后就直接是一个

HDU 5512 Meeting 博弈论

Meeting Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5512 Description n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, labelled from 1 to n. However, only two