Time of Update: 2018-12-05
/*題意:給你f個可選城市,每個城市都有其價值w0,國王的城市在1,現在國王不想見到你(國王不想通過某種路徑到達你選定的城市)——將你選的若干城市隔離出去,每條道路隔斷都需要花費w1,現在問你可以達到的最大價值並要求輸出你割斷的路的編號題解:網路流模型題,將所有可選點連入超級匯點,求出最小割(等於最大流),最大價值為所有可選點的價值和減去最小割我們預設最小割靠近源點的為左側,靠近匯點為右側所有的割邊的求法:最後一次求增廣路的過程中,匯點不可達,此時從源點可增流的點都在記錄路徑的數組Qu裡面枚舉數
Time of Update: 2018-12-05
其實就是劉汝佳書上的一道題改了一點而已,類似於類比題,就是看題麻煩點,其實意思很簡單的,一遍AC#include <iostream>#include <cstdio>#include <cstring>using namespace std;int main(){ //freopen("a.txt","r",stdin); int n,i(1); char str[1000010]; while(scanf("%d",&n)!
Time of Update: 2018-12-05
參考:http://hi.baidu.com/%CD%F4%BD%ADwangjiang/blog/item/aa3bc8ec3d549edbb31cb1a3.html http://apps.hi.baidu.com/share/detail/31832477題意:現在有一個n*m的方陣,方陣裡面的數字未知,但是我們知道如下約束條件: 1> 每一行的數位和 2> 每一列的數位和 3>
Time of Update: 2018-12-05
Bomberman - Just Search!Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 328 Accepted Submission(s): 158Problem DescriptionBomberman has been a very popular game ever since it was released. As you
Time of Update: 2018-12-05
struct bit{ int c[maxn] ; void init(){ memset(c , 0 ,sizeof(c)); } int lowbit(int x){ return x&(-x); } void add(int x ,int d){ //在x處加上d for( ; x < maxn ; x+=lowbit(x)) c[x]+=d ; }
Time of Update: 2018-12-05
/*題意:給定無向圖(有重邊)每條邊有一種顏色,邊權為1,讓你找到從1到n的最短路,並且經過的邊的顏色組成的序列的字典序最小。解答:1 分別spfa求出所有點到1和n的最短路d[0][i],d[1][i](可能經過的邊u-v滿足d[0][u]+1+d[1][v]=d[0][n])。 2 bfs搜尋最小的字典序序列,找出C[step]的最小顏色序號*/const int M=100009;const int N=400009;const int
Time of Update: 2018-12-05
/*在一個有向圖中找出所有的環,按字典序輸出解法:以每個點為起點dfs,搜尋u->v時如果v是已經訪問的點,那麼必然有v->u->v的環一直在糾結怎麼排序,怎麼判重。其實,在搜尋點i後,ins[i]不清空標記就行了,因為如果後續有環經過i,那麼這個環必然是重複的(從i搜尋的時候必然可以搜尋到)。*/#include<iostream> #include<cstdio> #include<cstring>
Time of Update: 2018-12-05
/*轉自:http://www.cppblog.com/Yuan/archive/2010/09/02/125667.html?opt=admin稍許改寫 有n(n<=20000)個未知的整數X0,X1,X2Xn-1,有以下Q個(Q<=40000)操作: I p v :告訴你Xp=v I p q v :告訴你Xp Xor Xq=v Q k p1 p2 … pk : 詢問 Xp1 Xor Xp2 .. Xor Xpk, k不大於15。
Time of Update: 2018-12-05
題目描述:在一個包含有N個點的無向圖中求出從標號為1到N的邊不相交的路徑,點可以相交。解題報告:先求一遍最短路,能滿足從1到n是最短路的邊一點滿足d[j]==d[i]+w[i][j](d[i]為點1到點i的最短路,w[i][j]為i到j的邊權) 把這樣的i,j在流網路中建一條邊權為1的有向邊;最後以1為源,n為匯求一次最大流,這樣就是無重邊的最短路的數目了#include<iostream>#include<cstdio>#include<cstring>
Time of Update: 2018-12-05
/*分別對x,y,z topsort就ok了注意有公用部分的時候的建邊*/#include <iostream>#include <cstdio>#include <cstdlib>#include <string>#include <cstring>#include <map>#include <vector>#include <cmath>#include<queue>using
Time of Update: 2018-12-05
出處:http://www.byvoid.com/blog/match-km/#respond[二分圖帶權匹配與首選]什麼是二分圖的帶權匹配?二分圖的帶權匹配就是求出一個匹配集合,使得集合中邊的權值之和最大或最小。而二分圖的首選則一定為完備匹配,在此基礎上,才要求匹配的邊權值之和最大或最小。二分圖的帶權匹配與首選不等價,也不互相包含。我們可以使用KM演算法實現求二分圖的首選。方法我不再贅述,可以參考tianyi的講解。KM演算法可以實現為O(N^3)。[KM演算法的幾種轉化]KM演算法是求最大權
Time of Update: 2018-12-05
/*題意:給定一些點,求一個點的序列,按照這個序列連接點(首尾也相連)使得形成一個多邊形(既任意連線和其他線不想交)直接極角排序就好了,注意共線的情況,除了在起始位置距離極點小的在前,其他位置距離極點遠的在前*/#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> const int MAXN = 2009; const double eps =
Time of Update: 2018-12-05
/*底面為xy平面和軸為z軸的圓錐,給定一些點,使得圓錐覆蓋所有點並且體積最小點都可以投射到xz平面,問題轉換為確定一條直線(交x,z與正半軸)使得與x的截距r和與z軸的截距h滿足h*r*r最小。三分,對於確定的h可以找到最佳的r,並且h*r*r的曲線必定只有一個極小值*/struct po{ double x,y;}p[10005];const double eps=1e-9;double Y;int n;double makeR(double h){ double R=0;
Time of Update: 2018-12-05
/*參考:http://hi.baidu.com/acfordream/blog/item/64b1527f7a5398f90ad187f6.html這個題大概是計算,一個區間會被多少區間覆蓋的問題:標準做法:套用別人寫的給定 n 個區間 (l, r),問每個區間被多少個另外的區間所包含。包含的定義 (l1, r1), (l2, r2),如果 l1 <= l2 < r2 <= r1 && (l1, r1) != (l2, r2),則 (l1, r1) 包含
Time of Update: 2018-12-05
/*篩出10000000內的素數顯然是不可行的;篩出3400內的素數來檢測10000000以內的數就ok了另外已經搜尋過的數用used標記,下次碰到標記過的就不在判斷,剪掉很多。*/#include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <map> #include <vector> #include &
Time of Update: 2018-12-05
/*題意:在一張圖上刪去一條邊,使得從1到n的最短路最長剛開始枚舉要刪去的邊x,求最短路,複雜度是m*n*log(n);果斷tle了後來想想只要在不刪邊的情況下求得最短路,記錄最短路經過的邊,然後枚舉這些邊中的一條為刪去的邊求最短路,使得這個值最多即可很顯然,刪去的邊不是原先最短路上的邊最短路沒有變,不會有影響,所以不必枚舉*/#include <cstdio>#include <iostream>#include <memory.h>#include<
Time of Update: 2018-12-05
描述:從t字串中尋找s字串,查到,就輸出Yes,否則,輸出No#include <cstdio>#include <cstdlib>#include <cstring>char s[10010],t[1000010];int main(){ //freopen("a.txt","r",stdin); while(scanf("%s%s",s,t)!=EOF) { int len_s=strlen(s),len_t=strlen(
Time of Update: 2018-12-05
這道題不是二叉樹形式的,沒法建二叉樹,不過可以通過建二叉樹的方法來做,不過這道題剛開始就考慮錯了,以為只有字母是節點,其實還包括數字等字元,結果交了好幾次wa……可惜啊#include <iostream>#include <cstring>#include <cstdio>using namespace std;void dfs(char s[210][210],int row,int clow,int len){ int k,l; for(
Time of Update: 2018-12-05
#include<cstdio>#include<cstring>#include<cmath>const int Row=9;const int MAX_COLOUMN = Row*Row*4+2;//最多出現列數const int MAX_ROW = Row*Row*Row+2;//最多出現的列數 int cnt[MAX_COLOUMN];//cnt[i]統計第i列1的個數int most,coloumn;bool
Time of Update: 2018-12-05
const int M=20010,ME=500000;const int INF=0x3f3fffff;//******************************int Head[M],Next[ME],Num[ME],Flow[ME],Cap[ME],Cost[ME],Q[M],InQ[M],Len[M],pre_edge[M];class MaxFlow{public: void clear()