P6030-[SDOI2012]走迷宫【高斯消元,tarjan,期望dp】

正题

题面链接:https://www.luogu.com.cn/problem/P6030


题目大意

nnn个点的一张有向图,求起点到终点的期望步数。保证每个强连通分量大小不超过100100100


解题思路

显然如果是强连通分量那么显然需要用高斯消元。

先把强连通用tarjantarjantarjan缩起来,如果有任何不是ttt的节点没有出度那么答案都为INFINFINF,然后剩下的每个用高斯消元做一次即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
using namespace std;
const int N=1e4+10;
int n,m,s,t,out[N],deg[N],top[N],pos[N];
int cnt,num,col[N],dfn[N],low[N];
double ans[N];bool ins[N];
vector<int> v[N];
stack<int> st;
struct Graph{int ls[N],tot;struct node{int from,to,next;}a[N*200];void addl(int x,int y){a[++tot].to=y;a[tot].from=x;a[tot].next=ls[x];ls[x]=tot;return;}
}G,D;
struct Guass{double a[110][110],b[110];void solve(int n){for(int i=1;i<=n;i++){int z=i;for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[z][i]))z=j;for(int j=1;j<=n;j++)swap(a[i][j],a[z][j]);swap(b[z],b[i]);for(int j=1;j<=n;j++){if(i==j)continue;double rate=a[j][i]/a[i][i];for(int k=i;k<=n;k++)a[j][k]-=rate*a[i][k];b[j]-=rate*b[i];}}for(int i=1;i<=n;i++)b[i]/=a[i][i];return;}
}M;
void tarjan(int x){dfn[x]=low[x]=++cnt;st.push(x);ins[x]=1;for(int i=G.ls[x];i;i=G.a[i].next){int y=G.a[i].to;if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]); }else if(ins[y])low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){++num;while(st.top()!=x){col[st.top()]=num;v[num].push_back(st.top());ins[st.top()]=0;st.pop();}col[st.top()]=num;v[num].push_back(st.top());ins[st.top()]=0;st.pop();}return;
}
void topsort(){int head=1,tail=1;top[1]=col[s];while(head<=tail){int x=top[head++];for(int i=D.ls[x];i;i=D.a[i].next){int y=D.a[i].to;deg[y]--;if(!deg[y])top[++tail]=y;}}return;
}
void calc(int id){int cnt=0;for(int i=0;i<v[id].size();i++)pos[v[id][i]]=++cnt;memset(M.a,0,sizeof(M.a));memset(M.b,0,sizeof(M.b));for(int p=0;p<v[id].size();p++){int x=v[id][p];if(!out[x])return;for(int i=G.ls[x];i;i=G.a[i].next){int y=G.a[i].to;if(col[x]!=col[y])M.b[pos[x]]+=1.0*ans[y]/out[x];else M.a[pos[x]][pos[y]]-=1.0/out[x];}M.a[pos[x]][pos[x]]+=1;M.b[pos[x]]+=1;}M.solve(cnt);for(int i=0;i<v[id].size();i++)ans[v[id][i]]=M.b[i+1];return;
}
int main()
{scanf("%d%d%d%d",&n,&m,&s,&t);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);if(x!=t){out[x]++;G.addl(x,y);}}tarjan(s);for(int i=1;i<=G.tot;i++){int x=G.a[i].from,y=G.a[i].to;if(col[x]!=col[y]&&col[x]!=col[t])deg[col[x]]++;}for(int i=1;i<=n;i++){if(i==t&&!dfn[i])return printf("INF\n")&0;if(col[i]!=col[t]&&dfn[i]&&!deg[col[i]])return printf("INF\n")&0;}memset(deg,0,sizeof(deg));for(int i=1;i<=G.tot;i++){int x=G.a[i].from,y=G.a[i].to;if(!col[x]||!col[y]||col[x]==col[t])continue;if(col[x]!=col[y]){D.addl(col[x],col[y]);deg[col[y]]++;}}topsort();for(int i=num;i>=1;i--)calc(top[i]);printf("%.3lf",ans[s]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何让敏捷软着陆?

背景当前&#xff0c;敏捷已经成为了2018的热词&#xff0c;执行敏捷研发模式的项目多数都是从瀑布模型转型过来的&#xff0c;瀑布模型是一套根深蒂固的传统流程&#xff0c;如果硬着陆的话&#xff0c;很容易折翼。笔者在各类项目敏捷实施过程中&#xff0c;总结了一些接地气…

牛客网【每日一题】4月24日 子序列

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 小美有一个由n个元素组成的序列{a1,a2,a3,…,an}&#xff0c;她想知道其中有多少个子序列{ap1,ap2,…,apm}…

[AGC031E] Snuke the Phantom Thief(网络流)

考虑枚举偷的珠宝的个数k&#xff0c;且假设它们按照坐标大小排好了序&#xff08;x坐标排一次&#xff0c;y坐标排一次&#xff09;。 那么可以将条件转化一下&#xff0c; 在珠宝按x坐标排好序时&#xff0c; x坐标大于等于aia_iai​的最多取bib_ibi​个可以转化为取的前k−…

YL杯超级篮球赛(jzoj 1325)

YL杯超级篮球赛 jzoj1325 题目大意 给n个点&#xff0c;每一个点都有一个值&#xff08;aia_iai​&#xff09;,现在让你找出一个点&#xff0c;使∑i1n(∣X−xi∣∣Y−yi∣)ai\sum_{i1}^{n} (|X-x_i||Y-y_i|)a_i∑i1n​(∣X−xi​∣∣Y−yi​∣)ai​最小&#xff0c;输出此…

P6088-[JSOI2015]字符串树【可持久化Trie,LCA】

正题 题面链接:https://www.luogu.com.cn/problem/P6088 题目大意 nnn个点的一棵树&#xff0c;每条边上有一个字符串&#xff0c;求一条路径上有多少以询问字符串为前缀的字符串。 解题思路 建立一个可持久化TrieTrieTrie&#xff0c;然后每个点继承父亲插入字符串。 然后询…

牛妹的游戏

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 UPD:数据保证不会有两条控制链控制的据点完全相同&#xff0c;也保证不会有某条控制链两端控制的据点相同…

.NET Core使用NLog通过Kafka实现日志收集

一、前言NET Core越来越受欢迎&#xff0c;因为它具有在多个平台上运行的原始.NET Framework的强大功能。Kafka正迅速成为软件行业的标准消息传递技术。这篇文章简单介绍了如何使用.NET(Core)和Kafka实现NLog的Target。在日常项目开发过程中&#xff0c;Java体系下Spring Boot …

[清华集训2017]无限之环(网络流)

很妙的一道题 对于每个格子&#xff0c;它合法与否&#xff0c;只跟它上下左右的相邻格子有关&#xff0c;所以可以想到黑白染色 &#xff08;用 (i,j) 表示 i 行 j 列的格子&#xff0c;我把 (ij) %2 0 的格子染成白色&#xff0c;把(ij)%2 1 的格子染成黑色&#xff09; …

【ST表】【单调队列】Window(jzoj 1326)

Window jzoj 1326 题目大意 给你一个序列a和一个数k&#xff0c;让你求a中所有长为k的子序列的最大值和最小值 输入样例 8 3 1 3 -1 -3 5 3 6 7输出样例 -1 -3 -3 -3 3 3 3 3 5 5 6 7数据范围 2020%&#xff1a; n\leqslant 500; 50%: n\leqslant 100000;20 100100%: n\l…

牛客网 【每日一题】4月23日题目精讲 边的染色

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小团有一张n个点&#xff0c;m条边的无向图G&#xff0c;有些边上已经被标记了0或1&#xff0c;表示它的边权…

ASP.NET Core 中的 ORM 之 Dapper

Dapper简介Dapper是.NET的一款轻量级ORM工具&#xff08;GitHub&#xff09;&#xff0c;也可称为简单对象映射器。在速度方面拥有微型ORM之王的称号。它是半自动的&#xff0c;也就是说实体类和SQL语句都要自己写&#xff0c;但它提供自动对象映射。是通过对IDbConnection接口…

P1446-[HNOI2008]Cards【Burnside引理,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P1446 题目大意 三个颜色的一些东西排在一起&#xff0c;给mmm种置换&#xff0c;求本质不同的染色方案数。 解题思路 BurnsideBurnsideBurnside引理&#xff1a;置换集合GGG时本质不同的序列方案等于∑x∈Gc(x)∣G∣\frac{\…

传送门(最短路树+可并堆)

Description 有一张n个点m条边的无向图&#xff0c;求删去任意一条边后&#xff0c;从S到T的最短距离的最大值 n, m ≤ 21052 \times 10^52105 Solution 这道题是[USACO09JAN]Safe Travel的变形&#xff0c;然后这是题解 Safe Travel这道题的普遍做法是并查集或树剖&#…

【DP】Mobile Service(jzoj 1327)

Mobile Service jzoj 1327 题目大意 某公司有三个员工&#xff0c;现在有n个时刻&#xff0c;某一时刻要一个员工到一个位置&#xff08;别的员工不能动&#xff09;&#xff0c;代价为ci,jc_{i,j}ci,j​&#xff0c;一个位置一个时刻最多有一个人&#xff0c;问最小代价是多…

用WinForm/WPF代码来为.NET Core 3.0功能投票

我们在5月报道过微软希望在.NET Core 3.0上运行WinForms和WPF。为了实现这个目标&#xff0c;他们正在构建一个新工具&#xff0c;该工具将允许你投票以决定他们需要把哪些API移植到.NET Core。但是&#xff0c;这不是一次直接进行的投票&#xff0c;而是基于你的应用程序正在使…

病毒扩散

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200429210705568.png?x-oss-processimage/waterm…

P3200-[HNOI2009]有趣的数列【卡特兰数】

正题 题目链接:https://www.luogu.com.cn/problem/P3200 题目大意 求一个长度为2∗n2*n2∗n的排列要求 奇数位和偶数位分别递增相邻的偶数位大于奇数位 解题思路 可以看做是一个2∗n2*n2∗n的序列按顺序填进奇数和偶数位&#xff0c;然后因为第二个要求所以奇数位在任何时候…

【SPFA】Party(jzoj 1328)

Party jzoj 1328 题目大意 有一个有向图&#xff0c;给你一个x&#xff0c;让你求每一个点到x再回去的最短路径&#xff0c;输出所有最短路径的最大值 输入样例 4 8 2 1 2 4 1 3 2 1 4 7 2 1 1 2 3 5 3 1 2 3 4 4 4 2 3输出样例 10 样例解释 数据范围 1⩽x⩽N⩽10001\le…

【每日一题】4月27日题目精讲 Removal

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld题目描述 Bobo has a sequence of integers s1, s2, …, sn where 1 ≤ si ≤ k. Find out the number of distinc…

[CF966E] May Holidays(树上数据结构问题、分块+虚树)

Description 一个 n 个结点的有根树&#xff0c;每个结点 x 有一个值 txt_xtx​&#xff0c;和一个颜色 (黑/白)。 m 次操作&#xff1a; 翻转某点颜色。询问有多少点 x 满足&#xff1a;x 为黑色&#xff0c;x 的白色后代数 > tx。 n, m ≤ 10510^5105 Solution 令 wi …