【HDU5521】Meeting
题目大意:给定一张\(N\)个点的图,构成了\(M\)个团,每个团内的边权均相等,求图上有多少个点满足到\(1\)号节点和\(N\)号节点的最大值最小。
题解:
本题的核心是如何优化连边,考虑对于每一个团增加一个虚拟节点,并让每个节点到虚拟节点连一条边权为\(t_i\)的有向边,虚拟节点到团中每一个点连一条边权为\(0\)的有向边,最后跑最短路求解即可。
注意:数据中有\(0\)下标的节点,读入时需要忽略,别问我怎么知道的。。。
代码如下
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
struct node {
  int to;
  LL w;
  node(int _to = 0, LL _w = 0) {
    to = _to;
    w = _w;
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  int T, kase = 0;
  cin >> T;
  while (T--) {
    int n, m;
    cin >> n >> m;
    vector<vector<node>> adj(n + m);
    for (int i = 0; i < m; i++) {
      LL w;
      int cnt;
      cin >> w >> cnt;
      while (cnt--) {
        int x;
        cin >> x;
        if (x == 0) continue;
        x--;
        adj[i + n].emplace_back(x, 0);
        adj[x].emplace_back(i + n, w);
      }
    }
    auto dij = [&](int st) {
      vector<int> expand(n + m, 0);
      vector<LL> d(n + m, 1e18);
      priority_queue<pair<LL, int>> q;
      d[st] = 0, q.push(make_pair(0, st));
      while (!q.empty()) {
        int x = q.top().second;
        q.pop();
        if (expand[x]) continue;
        expand[x] = 1;
        for (auto e : adj[x]) {
          int y = e.to, w = e.w;
          if (d[y] > d[x] + w) {
            d[y] = d[x] + w;
            q.push(make_pair(-d[y], y));
          }
        }
      }
      return d;
    };
    vector<LL> dst = dij(0);
    vector<LL> ded = dij(n - 1);
    if (dst[n - 1] == 1e18) {
      cout << "Case #" << ++kase << ": Evil John" << endl;
    } else {
      LL ans = 1e17;
      vector<int> p;
      for (int i = 0; i < n; i++) {
        LL ret = max(dst[i], ded[i]);
        if (ret < ans) {
          ans = ret;
          p.clear();
          p.push_back(i + 1);
        } else if (ret == ans) {
          p.push_back(i + 1);
        }
      }
      cout << "Case #" << ++kase << ": " << ans << endl;
      cout << p[0];
      for (int i = 1; i < (int)p.size(); i++) {
        cout << " " << p[i];
      }
      cout << endl;
    }
  }
  return 0;
}
												
											【HDU5521】Meeting的更多相关文章
- 【HDOJ5521】Meeting(最短路)
		
题意:有n个点,m个点集,每个点集中有e[i]个点,同一点集的点互相之间到达需要t[i]单位的时间,求min(max(dis(1,i),dis(i,n))),i属于[1,n] 输出最小值并増序输出所有 ...
 - 【LeetCode】堆 heap(共31题)
		
链接:https://leetcode.com/tag/heap/ [23] Merge k Sorted Lists [215] Kth Largest Element in an Array (无 ...
 - 【LeetCode】排序 sort(共20题)
		
链接:https://leetcode.com/tag/sort/ [56]Merge Intervals (2019年1月26日,谷歌tag复习) 合并区间 Input: [[1,3],[2,6], ...
 - 【LeetCode】贪心 greedy(共38题)
		
[44]Wildcard Matching [45]Jump Game II (2018年11月28日,算法群衍生题) 题目背景和 55 一样的,问我能到达最后一个index的话,最少走几步. 题解: ...
 - 一、Daily Scrum Meeting【Alpha】------Clover
		
[Alpha]Daily Scrum Meeting 第一次 [Alpha]Daily Scrum Meeting 第二次 [Alpha]Daily Scrum Meeting 第三次 [Alpha] ...
 - 【Beta】 第七次Daily Scrum Meeting
		
第七次meeting会议 [Beta] 第七次Daily Scrum Meeting 一.本次会议为第七次meeting会议 二.时间:10:00AM-10:20AM 地点:禹州楼 三.会议站立式照片 ...
 - 【Alpha】Daily Scrum Meeting
		
一 博客集合贴 11月15日 [Alpha]Daily Scrum Meeting——blog1 11月18日 [Alpha]Daily Scrum Meeting——blog2 11月19日 [Al ...
 - 【Alpha】阶段第十次Scrum Meeting
		
[Alpha]阶段第十次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 登出接口 编写后端说明文档 赵智源 编写脚本实现测试的持续集成 前测试点页面跳转逻辑测试 ...
 - 【Alpha】阶段第九次Scrum Meeting
		
[Alpha]阶段第九次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 编写获得所有学院接口 登出接口 赵智源 编写alpha版后测试点测试用例 编写脚本实现测 ...
 
随机推荐
- golang 二维切片
			
初始化: res := make([][length]int, length), 例如: res := make([][2]int, 10) fmt.Println(res) 输出: [[0 0] [ ...
 - orcale数据库授权码
			
Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca
 - Python 命名规范总结
			
Python推荐命名规范: 模块名和包名采用小写字母并且以下划线分隔单词的形式: 如:browser_driver 类名或异常名采用每个单词首字母大写的方式: 如:BasePage, Keyboard ...
 - vs code 更改快捷键
			
选择左下角设置图标,快捷键方式 文件列表修改,搜 list 文件tree list.focusUp -> ctrl+p
 - npm—入门指导
			
npm npm是什么? NPM(node package manager),通常称为node包管理器.顾名思义,它的主要功能就是管理node包,包括:安装.卸载.更新.查看.搜索.发布等. npm的背 ...
 - 关于greenlet的一些问题
			
今天测试关于协程方面的代码发现我安装了greenlet模块缺导入不进.如图: 后来找了半天才发现原来greenlet被整进了gevent包中,如下导入就可以成功: 但这个greenlet没有了swit ...
 - 网络编程[第二篇]基于udp协议的套接字编程
			
udp协议下的套接字编程 一.udp是无链接的 不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...
 - java 缓存
			
外存: 也就是我们经常说的(CDEF盘的大小)外储存器是指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据.常见的外存储器有硬盘.软盘.光盘.U盘等,一般的软件都是安装在外存中 ...
 - js判断变量是否为整数
			
//返回false则不为整数数字,返回ture则反之 var isIntNumber=function(val){ if (isNaN(val) || Math.floor(val) != val) ...
 - 一个SDL2.0程序的分析
			
//把图片加载到SDL_Texture SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren){ ...