題意:對於乙個有向圖,最多能加幾條邊依然使得圖不變為強聯通,如果原來就是強聯通,輸出-1,否則,輸出最多能增加的邊數
思路:最優解就是乙個完全圖刪邊的過程,刪到有且只有乙個點入度為0或者初度為0,所能增加的邊s=n*(n-1)-(n-1) ,若圖里存在強聯通分量,那麼就必須先縮點,把乙個強聯通分量看成乙個點,重新構圖,找到一點符合只有入度為0或者初度為0的「點」,這些點內連成完全圖1,把剩下的不屬於這個強聯通分量的其他點組成另一部圖也連成完全圖2,然後把這兩部圖連起來(有向邊),s=x*(x-1)+y*(y-1)+xy (x、y)分別為圖1圖2的點的個數
**;#include #include #include #include #include #include #include #include using namespace std;
const int m=100005;
struct node
edge[m];
int indu[m],outdu[m],head[m];
int belong[m],dfn[m],low[m],top,vis[m],num;
int n,m,cnt,st;
int stack[m];
bool instack[m];
int benum[m];
void addegde(int u,int v)
void tarjan(int u)
else if(instack[v])
}if(low[u]==dfn[u])
while(x!=u);
benum[st]=sum;//記錄同乙個強聯通的點的個數
}}int main()
{ int t,u,v,g=1;
scanf("%d",&t);
while(t--)
{memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(instack,0,sizeof(instack));
memset(benum,0,sizeof(benum));
memset(indu,0,sizeof(indu));
memset(outdu,0,sizeof(outdu));
st=top=num=cnt=0;
scanf("%d%d",&n,&m);
for(int i=0; i
HDU 多校聯合第四場
比賽的時候各種wa加tle。好糾結。01.至今沒搞懂怎麼個過程。04 gb用hash過得,後來看了一下標程,複雜度o n 3 尼嘛,我寫個o n 3 20 的演算法就超時。06 偶始終不明白容斥原理怎麼用的。估計各位大神是猜的公式,把1 p1 1 p2 1 pn這個式子寫出來後邊的就可以猜了。07....
2013第四場多校
多校第四場 6題,打得最好的一場多校。還是cjboy給力。本場比賽我基本上沒什麼貢獻,搞04一搞就是一下午。最後看了09覺得只有狀態壓縮,不知道怎麼優化。1004 圖論,強聯通分量 0 一開始推理的時候思路很清晰,但是接著就腦殘了,沒怎麼細想就直接去套樣例。以為得到了正確的解法,只是需要乙個特判。然...
hdu6070 2017hdu多校第四場
這道題是跟code force 834d很相像的一道題,題意說的是要求區間裡面不同數的個數除區間長度的最小值,首先先想到乙個公式si ze l r r l 1 size l,r 指的是l到r區間裡有多少個不同的數。我們可以列舉每個數,對於每個數來說,如果以這個數作為新的右端點,那麼左端點到上一次出現...