TYVJ 通向聚会的道路
来源:互联网 发布:js将二进制流转成文件 编辑:程序博客网 时间:2024/04/30 02:06
背景 Background
Candy住在一个被划分为n个区域的神奇小镇中,其中Candy的家在编号为n的区域,Candy生日这天,大家都急急忙忙赶去Candy家庆祝Candy的生日。描述 Description
Candy共有t个朋友住在不同的区域。小镇有m条道路,小镇的神奇之处在于其中的p1条道路只会在你走过区域的的个数为奇数时候开启,p2道路只会在你走过区域的个数为偶数的时候开启,剩下的道路一直都会开启。并且,所有的道路只能够单向通过。飘飘乎居士希望知道在所有的好朋友中,谁离Candy最近?。输入格式 InputFormat
第一行:两个正整数n m,表示共n个区域,m条道路接下来m行,每行三个正整数u v s表示u到v的单向道路,路程为s,其中第i条道路的编号为i。
接着一个整数p1以及p1个正整数odd[i],表示编号为odd[i]的道路只会在走过奇数个区域时开启。
接着一个整数p2以及p2个正整数even[i],表示编号为even[i]的道路只会在走过偶数个区域时开启。
接下来一个正整数 t
紧接着t行,每行一个正整数h以及一个不超过10个字符长度的字符串na(且均有小写字母组成),表示在h区域居住着名字为na的人。
输出格式 OutputFormat
第一行,即距离candy家最近的人的名字,数据保证有且只有一个人为最后的答案。第二行,该人到candy家的距离。
如果存在多解,则输入名字中字典序较小的一人。
样例输入 SampleInput
4 51 2 23 4 22 4 41 3 12 3 11 4 1 222 violethill1 pink
样例输出 SampleOutput
violethill4
数据范围和注释 Hint
pink尽管从1->3->4距离更近,但因为1->2的这条道路只有在走过奇数个区域时才开启,而pink此时走过的区域为偶数个(0个)(我们规定,出发点不算走第一个区域),所以pink只好沿1—>2—>3—>4,距离为5;Violethill尽管沿2—>3—>4距离为3,但因为3—>4这条道路只有在走过偶数个区域时才开启,当violethill从2到3时,只走了奇数个(1个)区域,道路不会开启。所以,violethill只好沿2—>4这条道路行走,距离为4,所以violethill比pink更快到candy家中,并且距离为4。
对于30%的数据 0<n<=100
对于100%的数据0<n<=10000 0<m<=100000
对于所有数据保证两区域间的距离<=100000
数据保证运算即结果在maxlongint以内
数据保证输入的正确性,即至少有一个人可以到达candy家中,并且一个区域最多只有一人,不会出现相同名字的人。
友情提示:可能出现有些道路既在odd中出现,也在even中出现。并且odd或者even中的数都可能出现重复数字。
题解
有意思的最短路,要拆点,像网络流那样,每个点i表示走到这个点时为奇数,i+n表示走到这个点时为偶数,同时要反向建图。
第一边打死活wa两个点,可重新打了一遍就a了。
#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>using namespace std;int n,m,tot;int x[100002],y[100002],z[100002];bool odd[100002],even[100002];int zz=0,head[20002];struct lu{int to,nx,v;} e[200002];int wz[10002]; char name[10002][15];int q[20002],dis[20002];bool pd[20002];void insert(int x,int y,int z){zz++; e[zz].to=x; e[zz].v=z; e[zz].nx=head[y]; head[y]=zz;}void build()//i为奇数点,i+n为偶数点 {for(int i=1;i<=m;i++) {if(odd[i]) insert(x[i],y[i]+n,z[i]);if(even[i]) insert(x[i]+n,y[i],z[i]);if((odd[i]|even[i])==0)//奇偶都有 {insert(x[i],y[i]+n,z[i]); insert(x[i]+n,y[i],z[i]); } }}void init(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++) scanf("%d%d%d",&x[i],&y[i],&z[i]);int p;scanf("%d",&p);for(int i=1;i<=p;i++) {int k; scanf("%d",&k); odd[k]=1;}scanf("%d",&p);for(int i=1;i<=p;i++) {int k; scanf("%d",&k); even[k]=1;}build();scanf("%d",&tot);for(int i=1;i<=tot;i++) scanf("%d%s",&wz[i],name[i]);}void spfa(){memset(dis,127/3,sizeof(dis));int t=0,w=0;dis[n]=0; dis[n+n]=0;q[w]=n; pd[n]=true; w=(w+1)%20002;q[w]=n+n; pd[n+n]=true; w=(w+1)%20002;while(t!=w) {int p=q[t],i=head[p]; t=(t+1)%20002; while(i) {if(dis[e[i].to]>dis[p]+e[i].v) {dis[e[i].to]=dis[p]+e[i].v; if(!pd[e[i].to]) {pd[e[i].to]=true; q[w]=e[i].to; w=(w+1)%20002; } }i=e[i].nx; }pd[p]=false; }}void find(){int ans=0x7fffffff; char ch[15];for(int i=1;i<=tot;i++) {if(dis[wz[i]+n]<ans) {ans=dis[wz[i]+n]; memcpy(ch,name[i],sizeof(name[i])); }else if(dis[wz[i]+n]==ans) {if(ch>name[i]) memcpy(ch,name[i],sizeof(name[i])); } }printf("%s\n%d",ch,ans);}int main(){init();spfa();find();return 0;}
0 0
- TYVJ 通向聚会的道路
- tyvj1467 通向聚会的道路
- 通向架构师的道路
- 通向架构师的道路
- Tyvj P1577 泥泞的道路
- 通向码农的道路(-)
- 通向码农的道路(面试官)
- 一条不知通向代码的道路
- 好的学习资料: 通向架构师的道路
- 通向架构师的道路之Oracle性能调优
- 通向码农的道路(运镖系统,推荐算法)
- 通向码农的道路(开源 libevent min_heap 实现)
- 1-通向架构师的道路之Apache整合Tomcat
- Tyvj 1577 泥泞的道路 (最小生成树+LCA)
- 通向架构师的道路之漫谈基于数据库的权限系统的设计 .
- 通向架构师的道路(第二十五天)SSH的单元测试与dbunit的整合
- 通向架构师的道路(第二十五天)SSH的单元测试与dbunit的整合
- 通向架构师的道路(第二十五天)SSH的单元测试与dbunit的整合
- android 权限大全
- POJ 2121 Inglish-Number Translator
- 完全卸载oracle11g步骤
- Tcp/Ip网络要点二(简易客户端编写)
- 对比C++理解Java函数传参数的方式
- TYVJ 通向聚会的道路
- Oracle行转列函数WMSYS.WM_CONCAT() 和 Listagg()
- jQuery页面滚动图片等元素动态加载实现
- 如何在Android中获知屏幕打开或者关闭
- tornado 服务器端受到get/post请求时,发生事情的流程
- VBA实现 Outlook 2010 自动密件抄送
- datatables参数解释
- ZooKeeper典型应用场景一览
- java输入输出流详解