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

请点击: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. 嵌入式开发之cgic库---cgi库的使用

    很幸运!用C语言写CGI程序还可以有比较简单的方式,那就是我们可以借助使用第三方库CGIC(CGIC是一个功能比较强大的支持CGI开发的标准C库,并支持Linux, Unix 和Windows等多操作 ...

  2. C# GetHashCode 的实现方式

    在项目中,在使用哈希表时.有时会须要Override GetHashCode. 这里给出一种普遍的做法: 版本号1:实现一个helper.传递类型T.返回这个类型的hashcode.函数逻辑非常直接, ...

  3. uva 10733 The Colored Cubes<polya定理>

    链接:http://uva.onlinejudge.org/external/107/10733.pdf 题意: N 种颜色可以涂成多少种立方体~ 思路: 使正六面体保持不变的运动群总共有: 1.不变 ...

  4. DuiLib笔记,基于WindowImplBase的基础模板

    Main.cpp #include <UIlib.h> using namespace DuiLib; class MainWindow : public WindowImplBase { ...

  5. CSS中float与A标签的疑问

    <stype> a{ text-decoration:none; float:left;} </stype> <div class="box1"> ...

  6. c语言之秒数算法

    // 水仙花树:是指一个3位数字,立方和 等于该数本身 // 秒数算法:随便输入一个大于0的数,求出对应的多少小时多少分钟多少秒 #include <stdio.h> / int main ...

  7. php-循环普通数组和关联数组

    <?php //循环普通数组 $arr=array("杭州","成都","拉萨"); $arrlength=count($arr); ...

  8. codeforces 460C. Present 解题报告

    题目链接:http://codeforces.com/submissions/ywindysai 题目意思:有 n 朵花,每朵花都有一定的高度(第 i 朵花对应 ai),m 天之后要把这些花送给别人. ...

  9. linux应用之perl环境的安装(centos)

    1.安装Perl环境 yum install perl*这个命令基本上把perl的模块给安装齐了.yum install cpanCPAN这个就不用说了吧,大家都懂. 如果你对perl模块版本要求比较 ...

  10. margin-top 为什么会影响父元素的 margin-top

    1.原因:  In this specification, the expression collapsing margins means that adjoining margins (no non ...