日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Forest Program dfs+tanjar仙人掌

發布時間:2023/11/27 生活经验 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Forest Program dfs+tanjar仙人掌 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接?CCPC2019 F題。

題意:給一顆仙人掌樹,讓你求每一個小環的邊的個數,用快速冪即可求解。

思路:第一反應是tanjar亂搞,把每個環上的點取出來,類似于縮點的方法。但是忽然感覺dfs能做,因為仙人掌比較特殊的性質,就是一個環上不會有多個分支。

那么首先我們從任一點出發,dfs下去記錄深度并且標記,當我們到達一個點標記過且深度小于當前點,證明我們剛好走了一個環,那么兩點的深度差+1就是該環的邊數,如果碰到標記過深度比當前點深度大呢,其實這個就是我們之前已經處理過的環了,直接跳過不管就行,就這樣就完了。

dfs代碼:

#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#include<list>
#include<time.h>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define lowbit(x) x&(-x)
#define min4(a, b, c, d) min(min(a,b),min(c,d))
#define min3(x, y, z) min(min(x,y),z)
#define max3(x, y, z) max(max(x,y),z)
#define max4(a, b, c, d) max(max(a,b),max(c,d))
typedef unsigned long long ull;
typedef long long ll;
#define pii make_pair
#define pr pair<int,int>
const int inff = 0x3f3f3f3f;
const long long inFF = 9223372036854775807;
const int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
const int mdir[8][2] = {0, 1, 0, -1, 1, 0, -1, 0, 1, 1, -1, 1, 1, -1, -1, -1};
const double eps = 1e-10;
const double PI = acos(-1.0);
const double E = 2.718281828459;
using namespace std;
const int mod=998244353;
const int maxn=3e5+5;
const int maxm=1e6+5;
struct node
{int to,p;
}edge[maxm];
int head[maxn],sign;
int vis[maxn];
int n,m;
ll res;
ll qmod(ll a,ll b)
{ll ans=1;while(b){if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}
ll qqmod(ll a,ll b)
{ll ans=qmod(a,b);ans=(ans-1+mod)%mod;return ans;
}
void init()
{for(int i=0;i<=n;i++) head[i]=-1,vis[i]=0;sign=0;
}
void add(int u,int v)
{edge[sign]=node{v,head[u]};head[u]=sign++;
}
void dfs(int u,int cnt)
{vis[u]=cnt;for(int i=head[u];~i;i=edge[i].p){int v=edge[i].to;if(vis[v]){if(vis[u]-vis[v]>1)//判斷是不是走了父親節點{ll c=vis[u]-vis[v]+1;res=res*qqmod(2,c)%mod;m-=c;}}else dfs(v,cnt+1);}
}
int main()
{int x,y;while(scanf("%d %d",&n,&m)!=EOF){if(m==0){puts("0");continue;}init();for(int i=1;i<=m;i++){scanf("%d %d",&x,&y);add(x,y),add(y,x);}res=1;dfs(1,1);res=res*qmod(2,m)%mod;printf("%lld\n",res);}return 0;
}

然后就是tanjar的做法。

其實很多人用點雙做這道題我覺得沒必要,而且我寫的一直超時(-.-

問題在于tanjar求聯通分量其實是求大環,就是第二個樣例其實就是一個大的連通分量

但是大概思路都是一樣的,也當是復習一哈。

當我們tanjar到一個點low[v]>=low[u]證明u點是一個割點,我們縮點的方法是把stack中直到等于u的點全部取出來

這里就是直到等于v的點全部取出來就行,然后+1就是該塊(塊描述應該是沒問題)的數量求出來了,

只有塊數量大于2才算一個環

代碼是T的,不曉得為啥~(希望大佬能幫助一下!

//#pragma comment (linker, "/STACK:102400000,102400000")
//#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#include<list>
#include<time.h>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define lowbit(x) x&(-x)
#define min4(a, b, c, d) min(min(a,b),min(c,d))
#define min3(x, y, z) min(min(x,y),z)
#define max3(x, y, z) max(max(x,y),z)
#define max4(a, b, c, d) max(max(a,b),max(c,d))
typedef unsigned long long ull;
typedef long long ll;
#define pii make_pair
#define pr pair<int,int>
const int inff = 0x3f3f3f3f;
const long long inFF = 9223372036854775807;
const int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
const int mdir[8][2] = {0, 1, 0, -1, 1, 0, -1, 0, 1, 1, -1, 1, 1, -1, -1, -1};
const double eps = 1e-10;
const double PI = acos(-1.0);
const double E = 2.718281828459;
using namespace std;
const int mod=998244353;
const int maxn=3e5+5;
const int maxm=1e6+5;
struct node
{int to,p;
}edge[maxm];
int head[maxn],sign;
int n,m;
int Stack[maxn],low[maxn],dfn[maxn];
int num[maxn];
int top,t,cnt;
ll p[maxn],r[maxn];
ll res;
ll qmod(ll a,ll b)
{if(r[b]) return r[b];int c=b;ll ans=1;while(b){if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}return r[c]=ans;
}
ll qqmod(ll a,ll b)
{if(p[b]) return p[b];ll ans=qmod(a,b);ans=(ans-1+mod)%mod;return p[b]=ans;
}
void init()
{t=top=cnt=sign=0;for(int i=1;i<=n;i++){low[i]=dfn[i]=0;head[i]=-1;}
}
void add(int u,int v)
{edge[sign]=node{v,head[u]};head[u]=sign++;
}
void tanjar(int u,int pre)
{dfn[u]=low[u]=++t;Stack[++top]=u;for(int i=head[u];~i;i=edge[i].p){int v=edge[i].to;if(v==pre) continue;if(!dfn[v]){tanjar(v,u);low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]){cnt++;num[cnt]=0;int x;do{x=Stack[top--];num[cnt]++;}while(x!=v);num[cnt]++;}}else low[u]=min(low[u],dfn[v]);}
}
int main()
{while(scanf("%d %d",&n,&m)!=EOF){if(m==0) {puts("0");continue;}init();int x,y;for(int i=1;i<=m;i++){scanf("%d %d",&x,&y);add(x,y),add(y,x);}res=1;for(int i=1;i<=n;i++)if(!dfn[i]) tanjar(i,i);for(int i=1;i<=cnt;i++)if(num[cnt]>=3) res=res*qqmod(2,num[cnt])%mod,m-=num[cnt];res=res*qmod(2,m)%mod;printf("%lld\n",res);}
}

?

總結

以上是生活随笔為你收集整理的Forest Program dfs+tanjar仙人掌的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品成人在线视频 | 麻豆成人免费视频 | 国产你懂得 | 冈本视频在线观看 | 中文字幕精品无码亚 | 欧美色图小说 | 海角社区id:1220.7126,10. | 国产精品波多野结衣 | www.黄色网| 久久久ww | 在线香蕉视频 | 老女人一区 | 东北少妇露脸无套对白 | 黑人爱爱视频 | 欧美精品自拍偷拍 | 免费高清欧美大片在线观看 | 美女啪啪av | 国产偷人爽久久久久久老妇app | 迈开腿让我尝尝你的小草莓 | 小sao货cao死你 | 日本一区二区三区视频在线播放 | www.爱色av.com | 国产伦精品视频一区二区三区 | 2019国产精品视频 | 91人妻一区二区 | 亚洲特黄一级片 | 国产精品手机在线观看 | 小草av在线 | 国产精品美女久久久久久久久 | wwwww在线观看 | 亚洲www啪成人一区二区麻豆 | 国产精品人成 | 18黄暴禁片在线观看 | 欧美xxxbbb| 在线观看国产一区 | sese在线| 亚洲精品成人久久 | 日韩av在线免费看 | 成人精品自拍 | 动漫毛片 | 跪求黄色网址 | 精品国产乱码久久久久久久软件 | 久久精品久久精品 | 又大又长粗又爽又黄少妇视频 | 亚洲成人黄色在线 | 六月婷婷综合网 | 91精品国产自产精品男人的天堂 | 狠狠躁夜夜 | 亚洲国产成人精品久久 | 国产破处在线 | 欧美10p | 免费在线黄色av | 免费激情网站 | 日本中文在线视频 | 夜色一区二区三区 | 日本三级欧美三级 | 黄色片高清 | 丁香六月综合 | 亚洲国产欧美日韩在线 | 黄色小视屏 | 毛片中文字幕 | 大陆农村乡下av | 4388成人网| 最好看的2018中文2019 | 久久精品视频网 | 青青草99 | 国产精品啪| 国产香蕉一区二区三区 | 午夜爽爽爽视频 | 免费毛毛片 | 在线看国产视频 | 性猛交xxxx乱大交孕妇2十 | 一本色道久久综合亚洲精品小说 | 99精品久久精品一区二区 | 人妻饥渴偷公乱中文字幕 | 日日碰日日摸 | 日韩精品――色哟哟 | 亚洲涩视频 | 青青青青青青草 | www.99av| 91超碰在线播放 | 亚洲精品中字 | www.黄在线观看 | 一直草 | 国产在线一级片 | 无码久久av一区二区三区 | 日韩毛片免费看 | 欧美人妖xxxx | 136福利视频导航 | 亚洲国产精品麻豆 | 17草在线| 中国黄色a级片 | 亚洲欧美一 | 狠狠五月 | 久久精品无码专区 | 欧美日韩一卡二卡三卡 | 国产男女猛烈无遮挡免费视频 | 欧美大片黄 | 国产高潮自拍 |