「我有個願望,我希望在燦爛千陽時遇見你。」
這是個有n個點的世界,有m條無向邊連線著這n個點,但是不保證點之間能夠互相到達。
「這個世界的夕陽,只在奇數長的簡單路徑的盡頭。」乙個神如是說。
於是我想知道對於乙個點對(x,y),x到y之間的所有簡單路徑中是否存在長度為奇數的路徑,只有這樣,我才能找到存在有夕陽的路。
如果兩個點存在奇數的路徑,那麼這兩個點存在於用乙個奇環中。
問題就是怎麼找奇環。
tarjan演算法。
那麼求邊雙連通分量,構出的tarjan樹,當存在一條虛邊的時候(就是連出去的那個點已經在棧中出現過了),那麼這個虛邊構成的簡單環中的邊都是奇環,退棧的時候暴力修改就好了。
最後詢問兩個點的lca,如果他們的深度差是奇數或者路徑中有奇環上的邊的話,那麼就合法。
#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
#define rep(i,a) for(i=first[a];i;i=next[i])
using
namespace
std;
const
int maxn=100007;
int i,j,k,l,t,n,m,ans,x,y,z,cas,u,v,zhi;
int first[maxn*2],last[maxn*2],next[maxn*2],num;
int f[maxn][20],g[maxn][20];
int dfn[maxn],low[maxn],stack[maxn],dfx,h[maxn],hhh,deep[maxn];
bool az[maxn],cz[maxn],bz[maxn];
void add(int x,int y)
int tarjan(int x)
else
if(az[last[i]])
low[x]=min(low[x],dfn[last[i]]);}}
}if(dfn[x]==low[x])
if(p)fo(i,stack[0]+1,u)g[stack[i]][0]++;
}}int lca(int x,int y)return x;
}int main()
fo(i,1,n)
fo(j,1,19)
for(scanf("%d",&cas);cas;cas--)
if(((deep[x]+deep[y]-2*deep[o])%2==1)||zhi)
else
printf("no\n");
}}
NOIP2016提高A組集訓第8場11 5總結
早上8 30才到機房,結果跳閘了,幾分鐘後修復。比賽時手動開始的,比較人性化。8 50開始看題。先是第一題,多次詢問給定區間內連續一段的和模p的值最小,資料範圍第一眼看嚇死人,第二眼發現p很小,於是想種p棵線段樹,然後就不知道怎麼搞了。第二題,詭異的求最小值問題,覺得像貪心,卻又不知從何下手,於是直...
NOIP2016提高組總結
這次noip可以用幾個字來形容 浪的飛起,頹的不行。中午從校門出發,在車上睡了半個車程。4 00左右,霧比較大,遠處的小蠻腰若隱若現。你好,廣州。5 00,symbol叫我們去看考場,結果被拒在門外,然後大家都散了。我與其它幾位小夥伴匆匆吃完飯,回到酒店,該看電視看電視,中途開會,提醒我們一些注意事...
NOIP2016 提高組 總結
這是倒數第三次noip了。今年我初三。去年的傷痕還未褪去,我在比賽前意識到,當務之急其實是鞏固基礎而非深究一些難題。於是賽前兩周,我認真讀了白書的前面部分,尤其重點練習了dp。dp作為基礎演算法之一,其靈活性極高,所以可以出得很難,也是各種比賽的寵兒。練好dp是尤為重要的。賽前好幾場模擬賽都做得很爛...