ABC245 G Foreign Friends

题目描述

有 N N N个人和 K K K个国家,每个人属于唯一的一个国家。第 i i i个人所属的国家为 A i A_i Ai​。其中,有 L L L个受欢迎的人,分别是 B 1 , B 2 , … , B L B_1,B_2,\dots ,B_L B1​,B2​,…,BL​。一开始,没有人相互是朋友。

对于 M M M对人,小 T T T可以花费 C i C_i Ci​的代价,使 U i U_i Ui​和 V i V_i Vi​成为朋友。

现在,对于每个 i ( 1 ≤ i ≤ N ) i(1\leq i\leq N) i(1≤i≤N),问 i i i是否能和另外一个国家的某个受欢迎的人成为直接或间接的朋友。所谓间接的朋友,是指他们之间有一条朋友关系的路径,路径上的每条边都表示一对朋友关系。 如果可以,输出小 T T T要花费的最小的代价,否则输出 − 1 -1 −1。

题解

这是一道最短路问题,我们可以使用Dijkstra。

每个点都跑一遍显然不行,所以我们可以考虑让每个受欢迎的人去与每个人交朋友。但如果每个受欢迎的人还是会TLE,所以要继续优化。

我们把所有受欢迎的人放在优先队列中跑最短路,并记录他们所属的国家。要保证每个人只会被每个国家更新一次。

我们需要在从优先队列中取出一个人的信息后再更新这个人。对每个人维护两个值:最小值和次小值。并且最小值和次小值所来自的受欢迎的人所属的国家不同。因为队列是优先队列,所以每个人第一次取出的值为最小值,第二次取出的值为次小值。

在输出时,如果最小值所来自的国家与这个人的国家不同,则输出最小值;否则因为次小值所来自的国家与最小值的不同,所以次小值所来自的国家与这个人所属的国家一定不同,输出次小值。

因为每个人只会被更新两次,用到优先队列,所以时间复杂度为 O ( n l o g n ) O(nlog \ n) O(nlog n)

code

#include<bits/stdc++.h>
using namespace std;
int n,m,k,t,x,y,z,tot,a[100005],b[100005],d[200005],l[200005],r[200005],us[100005];
long long tw[200005];
struct node{int c1,c2;long long v1,v2;
}w[100005];
struct vt{int x,c;long long dis;bool operator<(const vt ax)const{return dis>ax.dis;}
};
priority_queue<vt>q;
void add(int xx,int yy,int zz){l[++tot]=r[xx];d[tot]=yy;r[xx]=tot;tw[tot]=zz;
}
void dd(){while(!q.empty()){vt u=q.top();q.pop();if(us[u.x]<2&&w[u.x].c1!=u.c){if(!us[u.x]){w[u.x].c1=u.c;w[u.x].v1=u.dis;}else{w[u.x].c2=u.c;w[u.x].v2=u.dis;}++us[u.x];for(int i=r[u.x];i;i=l[i]){q.push((vt){d[i],u.c,u.dis+tw[i]});}}}
}
int main()
{scanf("%d%d%d%d",&n,&m,&k,&t);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=t;i++){scanf("%d",&b[i]);q.push((vt){b[i],a[b[i]],0});}for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);add(x,y,z);add(y,x,z);}dd();for(int i=1;i<=n;i++){if(a[i]==w[i].c1){if(w[i].c2) printf("%lld ",w[i].v2);else printf("-1 ");}else{if(w[i].c1) printf("%lld ",w[i].v1);else printf("-1 ");}}return 0;
}

ABC245 G Foreign Friends相关推荐

  1. AgreementMaker:Efficient Matching for Large Real-World 翻译

    正文之前 这篇文章还是我看前几天那个基于框架进行本体匹配的一个Previous Work里面的一个Previous Work.可以说有点菜,但是还是比较有参考意义的, 所以我把源码下载了下来,然后准备 ...

  2. 雅思阅读中同义替换词大总结

    1. 限制:limit, restrict, confine, define, narrow, tighten, constrict, cap narrow(v.): 这个词大家以前使用的时候一般都是 ...

  3. AtCoder Beginner Contest 245

    AtCoder Beginner Contest 245 文章目录 AtCoder Beginner Contest 245 A - Good morning B - Mex C - Choose E ...

  4. 文件上传之伪Ajax方式上传

    From: <由 Windows Internet Explorer 8 保存> Subject: =?gb2312?B?zsS8/snPtKvWrs6xQWpheLe9yr3Jz7SrI ...

  5. Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)

    Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1) 目录 Error in do_one(nmeth) : NA/ ...

  6. mysql foreign key 设置_mysql foreign key(外键) 说明与实例

    一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整性,关连性 ...

  7. mysql外键_MySQL外键约束(FOREIGN KEY)

    MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用.对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表). 外键用 ...

  8. MySQL外键约束(FOREIGN KEY)是什么?

    向导 外键约束 外键创建规则 创建外键约束语法 外键约束创建 修改创建外键约束 删除外键 完整格式创建 外键约束 MySQL的外键约束用来在两个表数据之间建立链接,其中一张表的一个字段被另一张表中对应 ...

  9. frame被废除_废除Microsoft Office:G Suite机会

    frame被废除 When I think of products underpinning our economy that are ripe for disruption, my mind fir ...

最新文章

  1. 计算机网络 陆魁军 ppt,计算机网络的应用基础概述.doc
  2. 码农如何快速打造一个有设计感的网站
  3. 将SAP订单以XML格式输出
  4. 干货 | 懂点儿经济学有什么用?
  5. ORA-01843 无效的月份的解决方法/NLS_DATE_FORMAT参数
  6. 协程分析之 context 上下文切换
  7. java 日期calendar_Java中用Calendar类计算周和周的起始日期(转)
  8. android mmkv使用_[Android]高性能MMKV数据交互分析-MMKV初始化
  9. 区块链“搅局”中介风云
  10. CAJ文件转PDF的简单方法
  11. npoi合并取消合并单元格
  12. 要做最快的男人,教你用Python写一个打字测试器测试你的打字速度~
  13. 【C++】简易小六壬起卦器
  14. 爱奇艺动画屋 android,爱奇艺奇巴布(com.qiyi.video.child) - 11.5.5 - 应用 - 酷安
  15. POJ 3278,抓牛问题(BFS)
  16. 没有基础适合学习java吗?
  17. STM32 中断向量表的位置 、重定向
  18. 群联PS3111+7DDL+JMS578转接板,开卡pSLC,附PS3111量产工具
  19. 三只松鼠、盐津铺子:战略相似,命运迥异
  20. dwcs5这么写php,如何备份Dreamweaver CS5的人个设置信息

热门文章

  1. refers to the module ‘django.db.model.BigAutoField‘ that could not be imported.
  2. 3.1 KickStart 无人值守批量安装Linux系统
  3. 10GE网卡终端聚合参数
  4. 微信太占用内存了,有什么办法清除?
  5. TIOBE 2 月编程语言排行榜(含热点语言学习图书推荐)
  6. 2 获取基金历史净值数据
  7. Ingress的概念和原理
  8. 一本通 2.6.1 贪心算法
  9. Android-冷门知识点汇总:你知道哪些Android中的冷门知识?
  10. python编写篮球_自制python版篮球经理游戏(5)—代码