先建一棵最小產生樹,然後看有幾個連通分量,就建幾個機場,最後從已選擇的邊中,將刪除所有比建機場貴的邊,加上相應的機場數!解題思路要清晰代碼:#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int N = 10010;const int M = 100010;int T, A;int n, m,
這是一道很典型的單源點最短路徑問題,用Dij來解,記錄路徑,通過dfs來輸出路徑代碼如下:#include <cstdio>#include <cstring>const int N = 20;const int INF = 100000000;int n, s, t, ans, icase;int g[N][N], d[N], p[N];void dij() { int mi, v; for ( int i = 1; i <= n; ++i ) d[
這道題坑在三個地方:第一,是忽略dij的最外層迴圈的次數應該是出現的節點的個數,而不是26次;第二,是忽略了除數為0的情況;第三,是輸入的問題,以後輸入單獨的字元,都用字串來處理代碼:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 30;const int INF =
很裸的一道求最小產生樹的題,只是資料很大,要用鄰接表來儲存代碼:#include <cstdio>#include <cstring>#include <vector>using namespace std;const int N = 200010;const long long INF = 10000000000;int n, m, id, head[N];long long sum;struct edge{ int t, next; int
/*剛開始TLE 後來發現遞迴函式找到23點的時候推到上一層就不逾時了,好吧。。。*/#include <stdio.h>#include <string.h>#include <stdlib.h>int sign[100][10];int flag;void print( int *A, int *P, int cur ){int i, j, c1, c2, sum;if( cur == 5 ){for( i = 0; i < 81; i++
常規題目;最小費用最大流,如果是無向圖的話,一定用鄰接表去做。代碼://最小費用最大流,注意建圖的edge都是雙向的#include <cstdio>#include <cstring>#include <queue>#include <iostream>using namespace std;const int INF = 0x3fffffff;const int N = 350;int S = 0, E;int n, m, k, p,