Time of Update: 2018-12-05
今天學習了2-SAT演算法簡單說一下對個演算法的理解首先它要解決的問題是:(以我個人理解)有n個物品,拿或不拿,兩個狀態;有m個條件,每個條件都限制怎麼個拿法,比如,如果那物品1,那麼一定不能拿物品3,或者要1必須拿3;2-SAT演算法給出怎麼拿,以及是否有解接下來是演算法本省內容:建圖:其實演算法本質,就是找到必要條件,比如說,x1||x2,
Time of Update: 2018-12-05
//普通鄰接矩陣 時間複雜度 O(v*e)#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>#define INF 999999int v;int map[505][505];int lowcost[505];int visit[1000];int prim( int start ){int min, choose, ans;ans =
Time of Update: 2018-12-05
這個道題,第一次鄰接表寫的,wa了,然後換的矩陣,結果還是不對,但是發現哪裡錯了主要是建圖,判斷兩個點是不是起點或者匯點,對這兩個點,就不要拆了,因為沒有費用其餘的所有的點,都用拆成兩個點,然後容量為這個computer的費用,其他的就按照規則,從原始點進,從拆出的點出矩陣的代碼如下:#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using
Time of Update: 2018-12-05
這是今年第一次,比較正式一點的比賽吧,題目也是和省賽的很像現在的我真的不知道是怎麼樣的一個層次,但是有時候真的感覺到自己很吃力,很水呀今天,這場比賽就過了兩道題,毛線哥還都給我提了醒,如果不是他,估計今天要掛掉了,比賽經驗感覺嚴重不足其實題目都不是特別難想,後來有兩道題目也想想出來解題思路了,但是很難過的是編碼卻不是很順利,總是出現各種錯誤,貪心那道題,是後面想出來的,毛線哥我應該是會的,我看了一下,確實,很明顯的貪心,但是我第一眼看到的時候,看到一段一段的,馬上反應到線段樹,想到小宇的幹活,我
Time of Update: 2018-12-05
注意資料類型,使用double!#include <cstdio>#include <cmath>#include <cstring>const int N = 110;struct Node { double x, y;}point[N];int n;double g[N][N];const double INF = 10000000000.0;const double eps = 1e-9;double prim() { double ans
Time of Update: 2018-12-05
這道題,wa了,原因是沒有需要建路的時候,輸出一行提示,我忽視了水題,唯一有點特別的是需要輸出建立的邊,那麼就要建一棵前驅樹,用數組表示代碼:#include <cstdio>#include <cstring>#include <cmath>const int N = 800;const double INF = 10000000000;int T, n, m, num, p[N];double map[N][N], d[N], x[N],
Time of Update: 2018-12-05
這道題求最小生樹中第k小的邊,很多人用的是kruskal演算法,但是由於邊很多的,其實我覺得正解應該是prim比較省時那麼如果用prim我們怎麼去求,那就要明確去一個概念,在實現prim的時候,有一個用於記錄的數組,它存放第i個節點到集合(已經被選為最小產生樹的點的集合)的最小邊的權值,那麼不管這個i節點和集合中哪一個點相連,當函數結束的時候,它就是表示i節點到它應當串連的那個節點的邊的權值,那以此類推,d數組就是存放了最小產生樹中的邊的權值。注意,d[1]這個起始點為0,因為1前面沒有邊了。那
Time of Update: 2018-12-05
很裸的模板題求最小產生樹,和次小產生樹代碼:#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 110;const int M = 310;const int INF = 100000000;int n, m, map[N][N], p[N], d[N], f[N][N], s1, s2, mark[N];void prim() {
Time of Update: 2018-12-05
三道水題第一道是沒什麼說的第二道是永遠都會有解的第三道是從整體考慮,長度相同,只有0不能產生1,有1的話,1可以增加和移動代碼如下A:#include <cstdio>#include <cstring>int main(){ int x, n; char sta[5]; while ( scanf("%d", &n) != EOF ) { getchar(); x = 0; while ( n-- )
Time of Update: 2018-12-05
很裸的一道最小瓶頸路的模板題,先求最小產生樹,然後在求點對點的最小瓶頸路代碼如下:#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int N = 210;const double INF = 1000000;int n, p[N];double x[N], y[N], map[N][N], f[N][N]
Time of Update: 2018-12-05
#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>using namespace std;typedef struct edges{ int u, v; double w;}edges;double X[1000], Y[1000];edges edge[5000]; int
Time of Update: 2018-12-05
又犯了輸出錯誤,從現在起,以後沒提交一道題之前,都必須要再審一遍輸出根據先進後出,可以推斷,如果有一個這樣的圖形,r[i] > r[i-1] && r[i] < r[i-2] 那麼就一定不符合代碼如下:#include <cstdio>#include <cstring>using namespace std;int n, rail[1010];int main(){ while ( scanf("%d", &n) != EOF
Time of Update: 2018-12-05
這道題,就是最大產生樹,以及瓶頸路上的最小權值邊代碼如下:#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <map>#include <iostream>using namespace std;const int N = 210;const int INF = -1;const int INFB = 100000
Time of Update: 2018-12-05
這是第一道KMP的題目。就是字串匹配問題,KMP其實思想很簡單,寫出來代碼也不是很長!代碼如下:#include <cstdio>#include <cstring>const int N = 1000000;const int M = 10000;int n, m, T;int a[N], b[M], next[M];void getNext() { int j, k; j = 0; k = -1; next[0] = -1; while ( j
Time of Update: 2018-12-05
這道題還是比較有考慮的價值的求:判斷是否有最小產生樹,次小產生樹,如果有次小產生樹,則輸出次小產生樹的總權值要注意的是,點和點之間是有重邊的,要求次小產生樹,就一定要保留所有重邊考慮到即要判斷圖是不是連通的,又要儲存重邊,所以Kruskal是首選,prim演算法或許有解,但是本人實在是沒有想出來怎麼樣比Kruskal能更加簡單,如果大牛經過,求指點次小產生樹一定是最小產生樹減一條邊,再加一條邊,枚舉掉最小產生樹中的邊,一次求少一條邊的圖的最小產生樹即可代碼如下:#include
Time of Update: 2018-12-05
這道題就是典型的有優先隊列以不一樣的標準排序,還有經常性了插入和刪除如果是優先隊列,就是按照x由大到小排序;隊列,按標號由小到大;棧,按標號有大到小。注意:一定要考慮到當出棧大於入棧的情況,這樣是impossible,而只有入棧沒有出棧是not sure;入棧大於出棧或者等於出棧都是正常處理的考慮周全代碼:#include <queue>#include <cstdio>using namespace std;struct pri_q { int x;
Time of Update: 2018-12-05
這道TLE了,用的是最初的網路流演算法,具體叫什麼演算法我就記不清了,但是像這樣的資料,是逾時了這道題主要是SAP求最大流資料不大,矩陣可以解決,後面的文章會寫關於SAP的知識的學習筆記裡面,會詳細說一下SAP演算法,這裡就直接說一下這道題這道題建圖不難,就是源點和題目, 容量1, 題目和目錄,容量1, 目錄和匯點,容量是目錄所包含的題目數代碼如下:(這也是一道模板題)#include <cstdio>#include <cstring>#include
Time of Update: 2018-12-05
很簡單的最小產生樹問題,主要優點不一樣的是,需要用到map代碼如下:#include <iostream>#include <algorithm>#include <map>#include <string>#include <cstring>using namespace std;const int N = 500;const int INF = 100000000;int n, m, st;int g[N][N],
Time of Update: 2018-12-05
#include <stdio.h>#include <string.h>#include <stdlib.h>char find[10][90];char replace[10][90];char input[300];void edit( char input[], int time ){ char temp1[300], temp2[300]; int i, j, len1, len2, t, turn, start, change,
Time of Update: 2018-12-05
這是典型的最小產生樹的題目,把已有的邊權值設為0即可下面是代碼:#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int N = 800;const double inf = 10000000;int n, m;double x[N], y[N], map[N][N];double prim( ) {