Time of Update: 2018-12-05
這題WA得我SB一樣.......竟然是聲明了一個函數沒有調用.....題意:在聯絡網中,去掉最少的聯絡點使得從S和T無法連絡。赤裸裸的求最小割點集的問題;建圖:網上都有,就不說了。怎樣找割點呢?在這裡變成了割邊。上一題POJ2125用的是DFS,找到集合S,那麼分跨S與T集合的邊就是割邊了。這麼做,對於二分圖還是很方便的。這裡卻行不通了。前面講過獨立軌的概念,圖G獨立軌最大條數p(S,T),就是圖的點割集的個數。在每條獨立軌的內頂點取一個點,組成的就是點割集了。這題要求的是字典序最小的點割集,
Time of Update: 2018-12-05
題目大意百度來的。看不懂=.=說科學家有奇怪生物,每兩個會合并,合并後的重量為2*sqrt(m1*m2);求最終合并的生物最小重量。由於m1+m2>=2*sqrt(m1+m2);所以每次在優先隊列中取出2個元素,進行合并。保證最後的解最小。題意沒懂WA了一次。#include<iostream>#include<queue>#include<cmath>using namespace std;double max( double a,double b )
Time of Update: 2018-12-05
這題的實質上是最短路徑問題。大意:從1到N的路程總花費小於等於K的最短路徑。每條路有花費和長度。依舊採用迪傑斯特拉的貪心思路,每次貪最短的,根據這個點來更新其他的點。這題我沒有注意的是加限制的優先隊列的性質:優先隊列的元素保證都是到目標點的花費小於等於K的,這樣下來,以長度為第一維度排序的優先隊列,第一次到達目標點為終點的時候,此時的len即為所求。我在這個點坑爹的TLE了。另外由於沒有消掉檔案讀寫WA了兩次。#include<iostream>#include<queue&g
Time of Update: 2018-12-05
題目大意:有一台雙核處理器的電腦,現有很多模組,每個模組放在不同的核中都有一個花銷。若某兩個模組不放在同一個核中執行,那麼會產生額外的花銷。求出使得所有的模組都進入處理器中的總花銷值最小。首先可以明確的是,該題為二分圖,模組放入兩個核中。如果沒有懲罰。那麼該題就是赤裸裸的最小割(其實是貪心)。源點S與Acpu中的點連邊,容量為模組放在A核中的費用。B核中的點與匯點連邊,容量為模組放在B核中的花銷。做一次最大流,流出的值即為最小割。現在考慮產生額外的花銷。若u,v不放在一個集合中。則會產生額外的花
Time of Update: 2018-12-05
#include<iostream>#include<cstdio>#include<cmath>using namespace std;struct POINT2D{ double x,y;}point[222];struct Edge{ int v,next;}E[111111];int match[222],ptr[222];int Edgenum;bool vis[222];void addEdge( int u,int v ){
Time of Update: 2018-12-05
基本的最小割問題做得也差不多了....這題整死我了.... 在Amber的論文裡有這個解法,大家去看看吧。其他的不說了。這題把資料類型全都改成long long才過,瞪大眼睛找了一晚上,沒找出trick.... 悲催.... 如果你也WA了,不妨試試這種方法... PS:我連bool都改long long了= =|||#include<iostream>#include<cstdio>#define INF 2100000000000560ll#define MN 555
Time of Update: 2018-12-05
注意細節細節!!!用網路流來做一定很輕鬆-.-將多重匹配變為最大匹配,資料較小,可以過....#include<iostream>#include<cstdio>using namespace std;struct Edge{ int v,next;}E[111111];struct SEG{ int s,e;};int ptr[222],match[222],Edgenum;bool vis[222];int change( char c ){ if( c=
Time of Update: 2018-12-05
這種題目做過蠻多道了,主要是再練習一下我的網路流鏈表寫法。這題坑爹的理解錯題意了,弄了很久。題意:有M個房間,現在要保護N號房間,房間編號為[0,M-1]。起初所有的房間的門都是開啟的,房間內有關門的控制台,也就是說,如果該房間能控制幾個相應的門,則從該房間可以通過這些門去往其他房間。如果控制台在其他房間裡,這門就不能在這房間裡開啟。現在要求的是關上最少的門使得要保護的房間不被入侵。思路:首先簡化模型,不考慮,控制關係,也就是說,門都是雙向的。那麼門可以從兩邊開啟,則在兩房間連上容量為1的邊,代
Time of Update: 2018-12-05
嗯~很久以前沒敲過的題,當時不懂狀態壓縮,不懂A*。因而沒過...現在用的康托展開+普通的BFS還是過了360ms也算是一個進步吧~A*現在還是沒有勇氣去寫... 加油!時間給我的不多了!~(用C++TLE了... 改為G++就過了...)Code:#include<stdio.h>#include<queue>using namespace std;struct node{ int eight[9];}S,E;int fec[10]={1,1,2,6,24,120
Time of Update: 2018-12-05
這題還是有點技巧的。我們求出了最大流,怎樣知道哪些邊可以使得流量增大呢?若存在e(U,V):S->U路徑上的點都有剩餘容量,V->T路徑上的點都有剩餘容量。如果有某條邊為上述情況,那麼對邊e進行擴容,最大流增大。應該十分好理解吧。通過源點進行DFS尋找S集合中所有的點進行標號,很容易。那麼...V到T可達這怎麼弄呢?同樣我們通過T來DFS只要存在點V到T有剩餘容量,則V為集合T的點,在DFS(V);由夠邊的特殊性,我們可以發現,當前邊k的反向邊就是k^1,通過k^1來判斷有剩餘容量就
Time of Update: 2018-12-05
D是圖G的一個頂點集,對於G的任一頂點U,要麼U是D集合的頂點元素,要麼U與D集合的某一頂點相鄰。那麼D稱為圖G的一個支配集。若在D中除去任何元素後,D都不再是支配集,則支配集D稱為極小支配集。稱D的所有支配集中頂點個數最少的支配集為最小支配集D0。r(G)=D0中頂點個數。稱作G的支配數。最小支配集一定是極小支配集;任何一個支配集以一個極小支配集為子集;G中所含的極小支配集可能有兩個以上,而且其頂點個數可以不同。但r(G)是唯一的。#include<iostream>#includ
Time of Update: 2018-12-05
再做有種親切感,比SG簡單多了.... 淚奔....將同行兩棋子之間的空格數視為某堆的石子數。進行一次Nim就OK了....#include<iostream>#include<cmath>using namespace std;int main(){ int N,M; while( scanf("%d %d",&N,&M)!=EOF ) { int xo=0; int a,b; for( int i=0;i<N;i++ )
Time of Update: 2018-12-05
K次方Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)Total Submission(s) : 10 Accepted Submission(s) : 3Font: Times New Roman | Verdana | GeorgiaFont Size: ← →Problem Description所有在程式設計已經有點經驗的人都知道,當k很大時你無法完整的表達出n k。例如:
Time of Update: 2018-12-05
SG的模板題,不多說。這裡採用記憶化深搜最佳化。Time=15ms還不錯。#include<iostream>#include<algorithm>using namespace std;struct EDGE{ int v,next;}E[11111111];int ptr[1111],Enum;int sg[1111];void addEdge( int u,int v ){ E[Enum].v=v; E[Enum].next=ptr[u]; ptr[u]
Time of Update: 2018-12-05
好吧~圖論的學習該告一段落了。這個題很有意思:說有幾個學校,相互傳遞盜版軟體,為單向傳遞關係。問給最少幾個學校盜版軟體,可以使得全部的學校都有盜版軟體。2問最少添加幾個傳遞關係,使得不論城管消滅其中的一條傳遞線路,還是能夠讓所有的學校都通過一張盜版光碟片傳遞完。思路呢....
Time of Update: 2018-12-05
題目大意:有一個R*C(R<=C)的棋盤,由黑白兩色格子組成,每列只有兩個白色格子,其餘為黑色。現在求:在每列恰巧取一個,每行最少取一個的取法,按列的順序由小到大輸出取出棋子所在的行。我的思路:由於每行最少取一個,可以先把行的最大二分圖匹配做出來,如果行都不能滿足,肯定是無解的。若行能匹配,再在流圖中找到匹配的路徑。那麼所有的行都找到了相應的列。那麼餘下的列隨便匹配就好了。網上思路:用帶上下限的網路流來做,基本上做到這種專題了。但是想到了不需要用這種方法也能過。先講講這種上下限吧:行至少有
Time of Update: 2018-12-05
hehe...這是一道很好的題目,以下給出兩種解法——思想都是採用貪心, 不過採用的資料結構不同。一、並查集#include<iostream>using namespace std;#define N 100000struct Node {int t, v;} a[N];int set[N+1];int cmp(const Node &a, const Node &b){ return a.v > b.v;}int main(){ int i,j,k;
Time of Update: 2018-12-05
一道很好的題目。大意:很多透明的矩形薄片平攤在平面上,每個矩形薄片有數字編號。現在給出矩形薄片的邊界與編號的座標。求出能唯一確定的矩形薄片的字母標號與數字編號。很容易轉化成二分圖的題。開始題意弄錯以為是必須全部都唯一匹配則輸出匹配序,不行則輸出none.現在的題意是求關鍵邊... 不用刪邊,特判就好.#include<iostream>#include<cstdio>using namespace std;struct RECT{ int
Time of Update: 2018-12-05
有很多出租車訂單,標記了開車時間與起點終點。如果出租車能在上一個訂單結束後,並且在下一個訂單的開車前1min到達起點,那麼我們說,這兩個訂單可以用一輛出租車來完成任務。轉化為最小路徑覆蓋問題。這裡是有向圖的最大匹配,可以用匈牙利演算法求解。以上....#include<iostream>#include<cstdio>using namespace std;struct SEG{ int s,e,a,b,c,d;}t[555];struct Edge{
Time of Update: 2018-12-05
這題WA了很久很久,確定演算法沒錯.. 但是還是WA了很久很久...原因是Ace的初值沒有賦值=.=細節決定成敗!!#include<iostream>#include<map>using namespace std;struct Edge{ int v,next;}E[6666];bool vis[66];int ptr[66],match[66],Edgenum;void addEdge( int u,int v ){ E[Edgenum].v=v;