【codevs2488】绿豆蛙的归宿
?
這個(gè)題開始正向拓?fù)渑判?#xff0c;然后各種wa,心灰意冷,找了個(gè)題解,和同學(xué)研究了半天,甚至曾經(jīng)一度認(rèn)為題解是錯(cuò)的。
這個(gè)題正向反向應(yīng)該都無所謂,但是我實(shí)在是蒻,打了半天正向都沒打過去,最后跟隨dalao的步伐走向了反向拓?fù)?/p> #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<stack> using namespace std; int n,m,x,y,z,head[100010],tail,ru[100010],chu[100010]; bool flag[100010]; double ans[100010]; queue<int>qwq; struct in {int to,ne,co; }ter[200020]; inline void build(int f,int l,int c) {ter[++tail]=(in){l,head[f],c},head[f]=tail; } int main() {memset(head,-1,sizeof(head));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d%d",&x,&y,&z),build(y,x,z),ru[x]++,chu[x]++;//反向建圖,因?yàn)閺?跑不到的點(diǎn)肯定反向建圖也跑不到1 for(int i=1;i<=n;i++)if(!ru[i])//如果原圖該點(diǎn),沒有出邊(終點(diǎn)) qwq.push(i);while(!qwq.empty()){int qaq=qwq.front();qwq.pop();//這里可以換成棧,跑的還更快,雖然我不知道為啥 for(int i=head[qaq];i>0;i=ter[i].ne){int t=ter[i].to;double gai=1.0/chu[t];ans[t]+=(ans[qaq]+ter[i].co)*gai;//求期望的必要步驟嘛qwq ru[t]--;if(!ru[t])qwq.push(t);} }for(int i=1;i<=n;i++)printf("%.2lf ",ans[i]);//printf("%.2lf",ans[1]); } /*關(guān)于這個(gè)反向拓?fù)渑判蚩梢缘脑?因?yàn)槊恳粋€(gè)點(diǎn)都可以到達(dá)終點(diǎn),所以無論正向反向,所有的從1到n的路徑的期望值都不會(huì)變 所以正向反向無所謂 為什么要用拓?fù)渑判?因?yàn)橹挥幸粋€(gè)點(diǎn)所有到他的邊都被走過,關(guān)于到它的期望值才算真正確定 */ #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<stack> using namespace std; int n,m,x,y,z,head[100010],tail,ru[100010],chu[100010]; bool flag[100010]; double ans[100010]; queue<int>qwq; struct in {int to,ne,co; }ter[200020]; inline void build(int f,int l,int c) {ter[++tail]=(in){l,head[f],c},head[f]=tail; } int main() {memset(head,-1,sizeof(head));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d%d",&x,&y,&z),build(y,x,z),ru[x]++,chu[x]++;//反向建圖,因?yàn)閺?跑不到的點(diǎn)肯定反向建圖也跑不到1 for(int i=1;i<=n;i++)if(!ru[i])//如果原圖該點(diǎn),沒有出邊(終點(diǎn)) qwq.push(i);while(!qwq.empty()){int qaq=qwq.front();qwq.pop();//這里可以換成棧,跑的還更快,雖然我不知道為啥 for(int i=head[qaq];i>0;i=ter[i].ne){int t=ter[i].to;double gai=1.0/chu[t];ans[t]+=(ans[qaq]+ter[i].co)*gai;//求期望的必要步驟嘛qwq ru[t]--;if(!ru[t])qwq.push(t);} }for(int i=1;i<=n;i++)printf("%.2lf ",ans[i]);//printf("%.2lf",ans[1]); } /*關(guān)于這個(gè)反向拓?fù)渑判蚩梢缘脑?因?yàn)槊恳粋€(gè)點(diǎn)都可以到達(dá)終點(diǎn),所以無論正向反向,所有的從1到n的路徑的期望值都不會(huì)變 所以正向反向無所謂 為什么要用拓?fù)渑判?因?yàn)橹挥幸粋€(gè)點(diǎn)所有到他的邊都被走過,關(guān)于到它的期望值才算真正確定 */ #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<stack> using namespace std; int n,m,x,y,z,head[100010],tail,ru[100010],chu[100010]; bool flag[100010]; double ans[100010]; queue<int>qwq; struct in {int to,ne,co; }ter[200020]; inline void build(int f,int l,int c) {ter[++tail]=(in){l,head[f],c},head[f]=tail; } int main() {memset(head,-1,sizeof(head));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d%d",&x,&y,&z),build(y,x,z),ru[x]++,chu[x]++;//反向建圖,因?yàn)閺?跑不到的點(diǎn)肯定反向建圖也跑不到1 for(int i=1;i<=n;i++)if(!ru[i])//如果原圖該點(diǎn),沒有出邊(終點(diǎn)) qwq.push(i);while(!qwq.empty()){int qaq=qwq.front();qwq.pop();//這里可以換成棧,跑的還更快,雖然我不知道為啥 for(int i=head[qaq];i>0;i=ter[i].ne){int t=ter[i].to;double gai=1.0/chu[t];ans[t]+=(ans[qaq]+ter[i].co)*gai;//求期望的必要步驟嘛qwq ru[t]--;if(!ru[t])qwq.push(t);} }for(int i=1;i<=n;i++)printf("%.2lf ",ans[i]);//printf("%.2lf",ans[1]); } /*關(guān)于這個(gè)反向拓?fù)渑判蚩梢缘脑?因?yàn)槊恳粋€(gè)點(diǎn)都可以到達(dá)終點(diǎn),所以無論正向反向,所有的從1到n的路徑的期望值都不會(huì)變 所以正向反向無所謂 為什么要用拓?fù)渑判?因?yàn)橹挥幸粋€(gè)點(diǎn)所有到他的邊都被走過,關(guān)于到它的期望值才算真正確定 */
?
轉(zhuǎn)載于:https://www.cnblogs.com/Loi-dfkdsmbd/articles/7706082.html
總結(jié)
以上是生活随笔為你收集整理的【codevs2488】绿豆蛙的归宿的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 P2251 质量检测
- 下一篇: Sublime Text 3 搭建 Re