具体题解又要搬大哥的了,嘿嘿~

请点击:G点我

这道题目的难点就是同一家公司的路直接走不需要再花费,然后多了一个公司这个东西,这个不像是边的副权值(瞎说的)之类的东西,这是对于路来说的,路的属性。。。

其实稀里哗啦说了那么多,真的觉得这个方法实在是太棒了;

将点和公司组合构造新点,然后新点的路我们可以构造,根据题意,同一家公司的路不需要花费即(u,c)《=》(v,c)之间距离=0;

然后u到(u,c)是1,v到(v,c)是1,建双向边。

这可以解决的是同一家公司的路不花费,把点边点根据题意拆分太棒了;

这里再贴一份我的挫代码:

//#include <bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<queue>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std; /*
最短路拆点,跑最短路;
*/ const int N=1e6+10;
const int INF=0x3f3f3f3f; map<pair<int,int>,int>mp; struct asd{
int to;
int w;
int next;
};
int head[N*8],tol,dd;
asd q[N*8];
int num[N*8];
bool vis[N*8];
int dis[N*8];
int n,m;
int que[N];
int s,t; int spfa()
{
s=0;
t=1;
for(int i=1;i<=dd+1;i++)
{
dis[i]=INF;
vis[i]=0;
num[i]=0;
}
dis[1]=0;
vis[1]=num[1]=1;
que[s]=1;
while(s<t)
{
int u=que[s];
s++;
vis[u]=0;
for(int v=head[u];v!=-1;v=q[v].next)
{
int i=q[v].to;
if(dis[i]>q[v].w+dis[u])
{
dis[i]=q[v].w+dis[u];
if(!vis[i])
{
num[i]++;
if(num[i]>=dd)
return -2;
vis[i]=1;
que[t]=i;
t++;
}
}
}
}
if(dis[n]!=INF)
return dis[n];
else
return -2;
}
int getid(int x,int y)
{
if(mp.find({x,y})!=mp.end())
return mp[{x,y}];
return mp[{x,y}]=++dd;
}
void init()
{
dd=n;
tol=0;
memset(head,-1,sizeof(head));
}
void add(int a,int b,int c)
{
q[tol].w=c;
q[tol].to=b;
q[tol].next=head[a];
head[a]=tol++;
}
int main()
{
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
int xx=getid(x,c);
int yy=getid(y,c);
add(xx,yy,0);
add(yy,xx,0);
add(x,xx,1);
add(xx,x,1);
add(y,yy,1);
add(yy,y,1);
}
printf("%d\n",spfa()/2);
return 0;
}

AtCoder Regular Contest 061 E - すぬけ君の地下鉄旅行【最短路】的更多相关文章

  1. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  2. AtCoder Regular Contest 061 DSnuke's Coloring

    http://arc061.contest.atcoder.jp/tasks/arc061_b 题意: H行W列的矩阵中,然后挖了n个洞,输出j(0-9)行,对于第i行输出,有多少个3*3区域中有i个 ...

  3. Atcoder Regular Contest 061 D - Card Game for Three(组合数学)

    洛谷题面传送门 & Atcoder 题面传送门 首先考虑合法的排列长什么样,我们考虑将每次操作者的编号记录下来形成一个序列(第一次 A 操作不计入序列),那么显然这个序列中必须恰好含有 \(n ...

  4. [Atcoder Regular Contest 061] Tutorial

    Link: ARC061 传送门 C: 暴力$dfs$就好了 #include <bits/stdc++.h> using namespace std; typedef long long ...

  5. [ARC061E]すぬけ君の地下鉄旅行 / Snuke's Subway Trip

    题目大意:Snuke的城镇有地铁行驶,地铁线路图包括$N$个站点和$M$个地铁线.站点被从$1$到$N$的整数所标记,每条线路被一个公司所拥有,并且每个公司用彼此不同的整数来表示. 第$i$条线路($ ...

  6. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  7. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  8. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  9. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

随机推荐

  1. Linux 中权限的再讨论( 下 )

    前言 上篇随笔讲述了Linux中权限的大致实现机制以及目录权限的相关规则.本文将讲解Linux中的三种特殊权限:SUID,SGID,Sticky权限.看完这两篇文章,你一定会对Linux的权限有个更深 ...

  2. 封装EF code first用存储过程的分页方法

    一年半没有做过MVC的项目了,还是很怀念(因为现在项目还是原来的ASPX),个人还是喜欢mvc,最近又开始重拾MVC,感觉既熟悉又陌生. 记录一下封装好的分页代码 首先先说下 我使用EF codefi ...

  3. iOS开发者必备:四款后端服务工具

    本文转载至 http://mobile.51cto.com/iphone-411917.htm 对于开发者来说,连接后端数据或许是一件特别痛苦的事情.但后端服务却能够帮助开发人员以更快的速度构建移动应 ...

  4. 针对Web.config敏感信息加密

    cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 ==在appSettings节点上添加== <configProtectedData> & ...

  5. if UDP is permitted

    Networking Basics (The Java™ Tutorials > Custom Networking > Overview of Networking) https://d ...

  6. A桶中有多少水?

    如果你能算出桶中有多少水,我便许你下山去玩.有一天,老和尚让小和尚将A桶的水挑到B桶去,可是小和尚却想下山玩,不愿意挑水,老和尚便说:”如果你能够根据我的提示算出A桶中有多少升水,我便许你下山去玩.” ...

  7. mongodb学习之:副本集

    前面一张介绍了主从模式,现在mongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式.副本集不能在一台电脑上操作.需要准备3台电脑进行搭建.副本集就是mongoDB副本所组成的一个集群. ...

  8. machine learning for hacker记录(3) 贝叶斯分类器

    本章主要介绍了分类算法里面的一种最基本的分类器:朴素贝叶斯算法(NB),算法性能正如英文缩写的一样,很NB,尤其在垃圾邮件检测领域,关于贝叶斯的网上资料也很多,这里推荐那篇刘未鹏写的http://mi ...

  9. jQuery事件函数位置放置的两种方法

    jQuery 事件函数 jQuery 事件处理方法是 jQuery 中的核心函数. 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法. 通常会把 jQuery 代码放到 <head& ...

  10. Unity编译时找不到AndroidSDK的问题 | Unable to list target platforms

    解决方式 1.从官网下载一个旧版本的 Android SDK tools 25.2.3.tools_r25.2.3-windows.zip. 2. 解压 3. 替换原来sdk目录下tools