某學校的每個建築都有乙個獨特的編號。一天你在校園裡無聊,決定在校園內隨意地漫步。
你已經在校園裡呆過一段時間,對校園內每個建築的編號非常熟悉,於是你情不自禁的把周圍每個建築的編號都記了下來——但其實你沒有真的記下來,而是把每個建築的編號除以 \(2\) 取餘數得到 \(0\) 或 \(1\),作為該建築的標記,多個建築物的標記連在一起形成乙個 \(01\) 串。
你對這個串很感興趣,尤其是對於這個串是回文串的情況,於是你決定研究這個問題。
學校可以看成一張圖,建築是圖中的頂點,而某些頂點之間存在無向邊。對於每個頂點我們有乙個標記(\(0\) 或者 \(1\))。每次你會選擇圖中兩個頂點,你想知道這兩個頂點之間是否存在一條路徑使得路上經過的點的標記形成乙個回文串。
乙個回文串是乙個字串使得它逆序之後形成的字串和它自己相同,比如 \(010\),\(1001\) 都是回文串,而 \(01\),\(110\) 不是。注意長度為 \(1\) 的串總是回文串,因此如果詢問的兩個頂點相同,這樣的路徑總是存在。此外注意,經過的路徑不一定為簡單路徑,也就是說每條邊每個頂點都可以經過任意多次。
輸入格式
第一行三個整數 \(n,m,q\),表示圖中的頂點數和邊數,以及詢問數。
第二行為乙個長度為 \(n\) 的 \(01\) 串,其中第 \(n\) 個字元表示第 \(i\) 個頂點(即頂點 \(i\))的標記,點從 \(1\) 開始編號。
接下來 \(m\) 行,每一行是兩個整數 \(u_i,v_i\),表示頂點 \(u_i\) 和頂點 \(v_i\) 之間有一條無向邊,不存在自環或者重邊。
接下來 \(q\) 行,每一行存在兩個整數 \(x_i,y_i\),表示詢問頂點 \(x_i\) 和頂點 \(y_i\) 的點之間是否有一條滿足條件的路徑。
輸出格式
輸出 \(q\) 行,每行乙個字串yes
,或者no
。輸出yes
表示滿足條件的路徑存在,輸出no
表示不存在。
樣例樣例輸入 1
5 4 2
00010
4 51 3
4 22 5
3 51 3
樣例輸出 1no
yes
樣例說明 1
對於第乙個詢問,\(3\) 號點和 \(2\) 號點不連通, 因此答案為no
。
對於第二個詢問,一條合法的路徑是 \(1 \to 3\),路徑上的標號形成的字串為 \(00\)。注意合法路徑不唯一。
樣例輸入 2
10 11 10
0011011111
4 610 6
5 94 7
10 7
5 81 9
5 71 10
5 15 6
10 3
7 48 10
9 48 9
6 62 2
9 910 9
3 4
樣例輸出 2no
yesyes
noyes
yesyes
yesyes
no
資料範圍與提示
對於 \(30\%\) 的資料,\(1 \le m \le 10^4\);
對於 \(70\%\) 的資料,\(1\le n\le 3\times 10^3,1 \le m \le 5\times 10^4\);
對於 \(100\%\) 的資料,\(1 \le n \le 5\times 10^3, 1 \le m \le 5\times 10^5, 1 \le q \le 10^5\)。
orz首先很容易想到暴力兩邊並行\(dfs\)的做法,這樣複雜度是\(o(m^2)\)的。
然後考慮優化建邊。
對於同種顏色的聯通塊,如果它是個二分圖就保留乙個生成樹邊就行了。因為對於一條非樹邊,它一定在乙個偶環上。假設現在走到\(a,b\),然後\(a\)要走非樹邊,那麼我們實際上隨便走乙個環,然後\(b\)就找乙個相鄰的同色節點(如果有的話)反覆橫跳,因為是偶環,所以是等價的。
如果不是乙個二分圖,那麼我們依然保留非樹邊,然後隨便從乙個點連乙個子環。因為我們可以改變路徑的奇偶。
對於兩邊顏色不同的邊,他們組成的圖一定是乙個二分圖。
**:
#include#define ll long long
#define n 5005
#define m 1000005
#define q 100005
using namespace std;
inline int get() while('0'<=ch&&ch<='9') return x*f;}
int n,m,q;
struct road s[m<<1];
int h[n],cnt;
void add(int i,int j) ;h[i]=cnt;
}vectore[n];
bool ans[n][n];
char str[n];
int col[n];
#define pr pair#define mp(a,b) make_pair(a,b)
queueque;
vectorvec;
void bfs()
while(!que.empty())
}} }
}int f[n];
int getf(int v)
int flag;
int w[n];
void dfs(int v,int col)
for(int i=1;i<=n;i++) vec.push_back(mp(i,i));
memset(w,-1,sizeof(w));
for(int i=1;i<=n;i++)
bfs();
while(q--)
return 0;
}
HNOI2019 校園旅行
人生第一道黑題祭 本題偏重思維 判斷回文可以考慮它的遞迴定義 只有乙個字元的串是回文串。只有兩個字元的串,如果這兩個字元相同,也是回文串 如果 s 是回文串,那麼在 s 的開頭和末尾插入乙個相同的字元,形成的新串也是回文串。乙個可以想到的方法是設 f 表示從 x 到 y 可不可行 然後 text 列...
HNOI2019 校園旅行
某學校的每個建築都有乙個獨特的編號。一天你在校園裡無聊,決定在校園內隨意地漫步。你已經在校園裡呆過一段時間,對校園內每個建築的編號非常熟悉,於是你情不自禁的把周圍每個建築的編號都記了下來 但其實你沒有真的記下來,而是把每個建築的編號除以 2 取餘數得到 0 或 1,作為該建築的標記,多個建築物的標記...
HNOI2019 校園旅行 DP
給定n nn個點,m mm條邊的圖。每個點有0 1 0 10 1的標號,有q qq個詢問,每次詢問點對 u,v u,v u,v 間是否一條路徑 不一定是簡單路徑 滿足路徑經過的點的標號所形成的串是回文串。n 5000,m 5000000 n leq 5000,m leq 5000000 n 5000...