fanvree 很聰明,解決難題時他總會把問題簡單化。例如,他就整天喜歡把圖轉化為樹。但是他不會縮環,那他怎麼轉化呢? 這是乙個有 n個點 m 條雙向邊的圖,fanvree 會選定乙個節點,然後刪掉這個節點和這個點連出去的邊,如果變成了一棵樹,那麼這個節點便是可行的,什麼是樹呢?樹也即無簡單環的無向連通圖。
告訴 fanvree 可能的節點是什麼。
對於 40%的資料:n,m<=1000;
另外存在 10%的資料:m=n-1;
另外存在 20%的資料:m=n;
對於 100%的資料:n,m<=100000
這道水題告訴我,太自信會出事!出大事!
你看那40分的資料,列舉刪哪個點dfs檢驗一下就過了,那10%的,說明不是個聯通的圖,找一下哪個點是單獨的就過了。那20%,說明是樹上加了個邊,找一下就行了。這就70了!!
而我堅信自己寫的是對的,縮了個點,然後刪去乙個點,剩下n-1個點,因此剩下n-2條邊,需要刪去m-(n-2)條邊,只要找度數為這個就沒錯了吧?
然而我跑去縮點,縮了點再在那個環裡找度數為m-(n-2)的邊,完美錯過正解。
其實根本不用縮點,只需要判一下割點,因為割點一定不在環內啊!!!!(顯然,樹上的每乙個點都是割點)而環內可能有割點
哎。。。
#includeusingnamespace
std;
#define n 100010
#define rt register
intn,m,t,cnt,tot,gro,cot,mark,root,child;
intdfn[n],low[n],deg[n],cut[n],ans[n],first[n];
struct
e[n*4
];
template
inline
void read(t &x)
while(ch>='
0'&&ch<='
9')
x*=f;
} inline
void add(int u,int
v)
inline
void tarjan(int u,int
fa)
else
low[u]=min(low[u],dfn[v]);
} if(child>1&&u==root)cut[u]=1
; }
intmain()
for(int i=1;i<=n;i++)
if(!deg[i])
for(rt int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i,i);
for(rt int i=1;i<=n;i++)
if(deg[i]==(m-(n-2))&&!cut[i])
ans[++cot]=i;
printf(
"%d\n
",cot);
for(rt int i=1;i<=cot;i++)printf("
%d "
,ans[i]);
return
0;
}
NOIP模擬 修路
這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...
NOIP模擬 項鍊
經過一番周折,bob找到了alice,為了安慰alice驚魂未定的心,bob決定給alice買一條手鍊,這條手鍊由m個珍珠組成,每個珍珠上刻著不同的小寫字母。當alice看到一些字母按照一定的順序排列成的字串時,就會產生一定的愉悅值。bob現在可以在這m個珍珠上刻上字母,現在他想知道,如何刻字母可以...
NOIP模擬 幻象
phantom是一位愛思考的哲 學家。最近phantom得到了森 妖精的真傳。在他練功的時候,每秒他的思緒中都有一定的概率浮現出奇 異的幻象,持續x秒的幻象將產生 空格 的幻象值。phantom練功發自真心,他想知道,在n秒內他期望產生的幻象值是多少。等我比賽完之後,我們才知道 空格 是x2 所以比...