[arc079f] Namori Grundy 分類討論
阿新 • • 發佈:2018-08-23
esc == 弱連通 是否 連通圖 max ask -o net
Description
給給全有一個NN個點NN條邊的有向圖,點的的編號從11到NN
給給全的圖有NN條邊,形如:(p1,1),(p2,2),...,(pN,N)(p1,1),(p2,2),...,(pN,N),保證圖是弱連通的。其中,(u,v)(u,v)表示一條從點uu到vv的單向邊。“弱連通”是指:假如所有的邊都是雙向邊,則圖連通圖
給給全為每個點設置了一個權值,aiai表示點ii的權值。因為他很給給,所以他希望圖滿足如下性質:
- 所有aiai都是非負整數
- 對於每條邊(i,j)(i,j),滿足ai≠ajai≠aj
- 對於所有i,x(0≤x≤ai)i,x(0≤x≤ai),存在一條邊(i,j)(i,j)滿足x=ajx=aj
請你幫給給全判斷一下,這樣給給的圖是否存在呢?
Input
第一行一個正整數NN
第二行NN個正整數,第ii個數表示pipi
Output
如果存在這樣的圖,輸出POSSIBLE,否則輸出IMPOSSIBLE
Sample Input
Sample #1
4
2 3 4 1
Sample #2
3
2 3 1
Sample #3
4
2 3 1 1
Sample #4
6
4 5 6 5 6 4
Sample Output
Sample #1 POSSIBLE Sample #2 IMPOSSIBLE Sample #3 POSSIBLE Sample #4 IMPOSSIBLE
HINT
樣例一的一種可行點權分配是{ai}={0,1,0,1}{ai}={0,1,0,1}或{ai}={1,0,1,0}{ai}={1,0,1,0}
樣例三的一種可行點權分配是{ai}={2,0,1,0}{ai}={2,0,1,0}
2≤N≤2000002≤N≤200000
1≤pi≤Npi≠i1≤pi≤Npi≠i
保證圖是弱聯通的
本題采用subtask。分別存在:
- 20%20%的數據滿足n≤18n≤18;
- 20%20%的數據隨機;
- 20%20%的數據中pipi互不相同。
題面修正:
- aiai非負;
- 是0≤x<ai0≤x<ai;
- 你需要設置的是aiai。
Sol
orzckw
這題放f有點簡單了吧?
Code
#include <bits/stdc++.h> using namespace std; int n,x=1,mx,mn,cnt,vis[200005],fa[200005],cir[200005],a[200005];vector<int> e[200005]; int dfs(int x) { for(int i=0;i<e[x].size();i++) if(!cir[e[x][i]]) dfs(e[x][i]); for(int i=0;i<e[x].size();i++) if(!cir[e[x][i]]) vis[a[e[x][i]]]=1; for(a[x]=0;vis[a[x]];a[x]++); for(int i=0;i<e[x].size();i++) if(!cir[e[x][i]]) vis[a[e[x][i]]]=0; return 0; } int main() { scanf("%d",&n),mx=-1,mn=n+1,cnt=0; for(int i=1;i<=n;i++) scanf("%d",&fa[i]),e[fa[i]].push_back(i); while(!vis[x]) vis[x]=1,x=fa[x]; memset(vis,0,sizeof(vis));while(!cir[x]) cir[x]=1,x=fa[x]; for(int i=1;i<=n;i++) if(cir[i]) dfs(i),mx=max(a[i],mx),mn=min(a[i],mn),cnt++; (mx==mn&&cnt%2==1)?printf("IMPOSSIBLE\n"):printf("POSSIBLE\n"); }
[arc079f] Namori Grundy 分類討論