route(2018.10.24)
建出最短路图之后\(topsort\)即可。
具体思路:
先用\(dijkstra\)算法在原图中跑出\(1\)号点到\(i\)号节点的最短距离\(dist_1(i)\),将所有边反向后用\(dijkstra\)算法求出\(i\)号点到\(2\)号点的最短距离\(dist_2(i)\);
再沿着最短路径找到从\(1\)号点到\(i\)号点的方案数\(f(i)\),以及\(i\)号点到\(2\)号点的方案数\(g(i)\);
如果一条起点为\(a_i\),终点为\(b_i\),长度为\(c_i\)的边满足\(f(a_i)*g(b_i)==f(2)\)且\(dist_1(i)+c_i+dist_2(i)==dist_1(2)\)则该边是原图中从\(1\)号点到\(2\)号的最短路径的必经之路。
将第i条边反向后对该边进行分类讨论
\(1.dist_2(ai)+dist_1(bi)+ci < dist_1(2)\) 则最短路径的长度变短了
\(2.dist_2(ai)+dist_1(bi)+ci == dist_1(2)\) ,则最短路径的长度并没有发生变化
\(3.dist_2(ai)+dist_1(bi)+ci > dist_1(2)\)
\(a.\)如果该边不是原图最短路径的必经之路,则最短路径的长度并没有发生变化
\(b.\)如果该边是原图最短路径的必经之路,则最短路径的长度变长了或者新图中不存在从\(1\)号点到\(2\)号点的路径
(当不存在从\(1\)号点到\(i\)号点的路径时,\(dist_1(i)\)为极大值,\(dist_2(i)\)同理)
时间复杂度\(O((m+n)log(n))\),但当路径数量过多时,\(f\)值和\(g\)值会超出\(int\)的储存范围
期望\(100\)分解法:
在上述求必经之路的时候用拓扑序或者其他方法求在最短路径构成的图上的桥
但是我太傻逼了,唉!
代码:
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int n,m,x[100001],y[100001],cnt,ans[100001],z[100001],dis[100001],dis1[100001],pre[100001],nxt[100001],h[100001],v[100001],c[100001],sum,in[100001],pree[100001],nxtt[100001],hh[100001],vv[100001],f[100001],g[100001];
struct oo{int x,y;};bool vis[100001];
bool operator<(oo a,oo b){return a.x>b.x;}
priority_queue<oo>q;
void add(int x,int y,int z){pre[++cnt]=y;nxt[cnt]=h[x];h[x]=cnt;v[cnt]=z;}
void ins(int x,int y,int z){pree[++cnt]=y;nxtt[cnt]=hh[x];hh[x]=cnt;vv[cnt]=z;}
void dijkstra(int x,int *dis,int id)
{
memset(vis,0,sizeof vis);
q.push((oo){0,x});dis[x]=0;
while(!q.empty())
{
oo x=q.top();q.pop();
if(vis[x.y])continue;vis[x.y]=1;
for(int i=h[x.y];i;i=nxt[i])
if(dis[pre[i]]>dis[x.y]+v[i])
{
dis[pre[i]]=dis[x.y]+v[i];
q.push((oo){dis[pre[i]],pre[i]});
}
}
}
void topsort(int x,int *f)
{
queue<int>que;
que.push(x);f[x]=1;
while(!que.empty())
{
int now=que.front();que.pop();
for(int i=hh[now];i;i=nxtt[i])
{
f[pree[i]]+=f[now];
if(!(--in[pree[i]]))que.push(pree[i]);
}
}
}
int main()
{
// freopen("route.in","r",stdin);
// freopen("route.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d%d%d",&x[i],&y[i],&z[i]),add(y[i],x[i],z[i]);
memset(dis1,63,sizeof dis1);memset(dis,63,sizeof dis);
dijkstra(2,dis1,0);
memset(h,0,sizeof h);cnt=0;
for(int i=1;i<=m;i++)add(x[i],y[i],z[i]);
dijkstra(1,dis,1);cnt=0;
memset(vis,0,sizeof vis);
for(int i=1;i<=n;i++)
for(int j=h[i];j;j=nxt[j])
if(dis[i]+v[j]+dis1[pre[j]]==dis[2])vis[j]=1,ins(i,pre[j],v[j]),x[cnt]=i,y[cnt]=pre[j],z[cnt]=v[j],in[pre[j]]++;
topsort(1,f);
memset(hh,0,sizeof hh);memset(in,0,sizeof in);int sum=cnt;cnt=0;
for(int i=1;i<=sum;i++)ins(y[i],x[i],z[i]),in[x[i]]++;
topsort(2,g);
for(int i=1;i<=n;i++)
for(int j=h[i];j;j=nxt[j])
{
if(vis[j]){if(f[i]*g[pre[j]]==f[2])ans[j]=1;}
else if(dis1[i]+v[j]+dis[pre[j]]<dis[2])ans[j]=-1;
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}
route(2018.10.24)的更多相关文章
- python中使用Opencv进行车牌号检测——2018.10.24
初学Python.Opencv,想用它做个实例解决车牌号检测. 车牌号检测需要分为四个部分:1.车辆图像获取.2.车牌定位.3.车牌字符分割和4.车牌字符识别 在百度查到了车牌识别部分车牌定位和车牌字 ...
- 2018.10.24 NOIP2018模拟赛 解题报告
得分: \(100+0+100=200\)(\(T2\)悲惨爆\(0\)) \(P.S.\)由于原题是图片,所以我没有上传题目描述,只有数据. \(T1\):query(点此看题面) 熟悉主席树的人都 ...
- 课堂笔记及知识点----树(2018/10/24(pm))
树 概念:由一个或多个(n≥0)结点组成的有限集合 T, 有且仅有一个结点称为根( root), 当 n>1时,其余的结点分为 m(m≥0)个互不相交的有限集合 T1,T2, …, Tm.每个集 ...
- 课堂笔记及知识点----栈和队列(2018/10/24(am))
栈: Stack<int> xt=new Stack<int>() ; 先进后出,后进先出,水杯结构,顺序表类似 常用方法: .pop---->出栈,弹栈 ...
- 2018.10.24 bzoj3195: [Jxoi2012]奇怪的道路(状压dp)
传送门 f[i][j][k]f[i][j][k]f[i][j][k]表示前iii个点连了jjj条边,第i−K+1i-K+1i−K+1~iii个点连边数的奇偶性为kkk时的方案数. 转移规定只能从后向前 ...
- 2018.10.24 bzoj2064: 分裂(状压dp)
传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...
- 2018.10.24 NOIP模拟 小 C 的宿舍(分治)
传送门 分治妙题. 没有这道题的暴力分今天又垫底了啊233 由于用了分治的方法,我们只用考虑左区间对右区间的贡献以及右区间对左区间的贡献. 可以发现如果从中点开始向两边递推最小值并用这个区间最小值来推 ...
- 2018.10.24 NOIP模拟 小 C 的序列(链表+数论)
传送门 考虑到a[l],gcd(a[l],a[l+1]),gcd(a[l],a[l+1],a[l+2])....gcd(a[l]...a[r])a[l],gcd(a[l],a[l+1]),gcd(a[ ...
- 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)
传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...
随机推荐
- HttpURLConnection 接收网络数据出现乱码问题
由于接收的数据经过gZip处理过,所以在接受的时候也要处理,并且加上编码格式(没有会出现部分数据乱码): 具体代码实现如下: URL ul = new URL(url); HttpURLConnect ...
- Spring 4.2框架中注释驱动的事件监听器详解
事件交互已经成为很多应用程序不可或缺的一部分,spring框架提供了一个完整的基础设施来处理瞬时事件.下面我们来看看Spring 4.2框架中基于注释驱动的事件监听器. 1.早期的方式 在早期,组件要 ...
- php遍历统计文件目录和文件
function total($dirname, &$dirnum, &$filenum){ $dir=opendir($dirname); readdir($dir)."& ...
- error MSB6006: “CL.exe”已退出,代码为 -1073741502。
错误1error MSB6006: “CL.exe”已退出,代码为 -1073741502.C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Plat ...
- 为什么要把页面放在 WEB-INF 路径下?
1.基于不同的功能 JSP 被放置在不同的目录下 这种方法的问题是这些页面文件容易被偷看到源代码,或被直接调用.某些场合下这可能不是个大问题,可是在特定情形中却可能构成安全隐患.用户可以绕过Strut ...
- 【转载】Java的接口和抽象类
尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811437.html 也不知道,面试为什么经常用到这个知识点—— 一.抽象类 在了 ...
- 烂笔头——JAVA/JSP
学艺不精,一些小零头放这里备忘 Object[] obj = (Object[])list.get(i);//取list的某个项目 jsp中出现out.println( )和System.out.pr ...
- 小工具之Synergy
用于两个主机共享键盘和鼠标的工具: 软件名字:synergy软件主页: http://synergy-foss.org支持平台:linux,mac,windows 通吃 作用:通过网络在多台主机之间共 ...
- react之redux增加删除数字
比如在页面中添加和删除‘222’ action.js export const ADD= 'ADD'; export const RED='RED'; export const add=(str)=& ...
- 12306.cn网站自动登录器源代码
去年过年放假的时候写了一个12306.cn网站的自动登录器,刚好那时候放假了,所以没把源代码放出来,现在将代码发出来,由于编写得比较仓促(从放假的下午19:00左右到晚上到00:00左右),很多细节问 ...