題目一: Shuttle Puzzle
只能找規律了。。。。
#include <stdio.h><br />#include <string.h><br />int n, tot;<br />void display(int m, int st, int s) {<br />for (int j = 1; j <= m; j++, st += s) {<br />if (++tot % 20 == 0) printf("%d/n", st); else printf("%d ", st);<br />}<br />}<br />void PRINT(int m, int min) {<br />int st, s;<br />if (min == 0) return;<br />if (m % 2 == 0) {<br />st = min;<br />s = 2;<br />} else {<br />st = min+(m-1)*2;<br />s = -2;<br />}<br />display(m, st, s);<br />PRINT(m+1, min-1);<br />if (min == 1) return;<br />display(m, st, s);<br />}<br />int main(){<br />freopen("shuttle.in", "r", stdin);<br />freopen("shuttle.out", "w", stdout);<br />scanf("%d", &n);<br />tot = 0;<br />PRINT(2,n);<br />printf("%d/n", n+1);<br />return 0;<br />}<br />
題目二:Pollutant Control
** Description: 題目實際上要求一個最小割,並且滿足經過的邊要最少,最後字典序要最小
** Algorithm: MaxFlow(DINIC)
** Analysis: 相當於有三個優先順序,流量最高,邊數其次,最後是編號
把一條邊的權值做如下處理
ww = 500000+i+(long long)500000*1001*w;
500000: 因為邊的編號為0..1..2....999 和<500000
1001: 因為最多有1000條邊
最後 MaxFlow = MaxFlow'/ (500000*1001)
經過的邊數: MaxFlow'%(500000*1001)/500000
割S中的點可以通過FLOODFILLED來求,切記不可直接判斷某些邊滿流即為割
#include <iostream><br />#include <stdio.h><br />#include <string.h><br />#include <cstring><br />#include <queue><br />#define MAXE 2000<br />#define MAXN 40<br />const long long INF = (long long) 1 << 62;<br />using namespace std;<br />struct E {<br />int u, v;<br />long long f;<br />int next;<br />} e[MAXE];<br />int M, S, T;<br />int pre[MAXN];<br />int d[MAXN];<br />int incut[MAXN];<br />int head[MAXN], h[MAXN];</p><p>void add(int,int,long long);<br />bool BFS();<br />void DFS(int);<br />long long Dinic();</p><p>int main() {<br />freopen("milk6.in", "r", stdin);<br />freopen("milk6.out", "w", stdout);<br />int n, m, i, w;<br />int u[MAXE], v[MAXE];<br />long long ww, ans;<br />scanf("%d%d", &n, &m);<br />S = 1; T = n; M = 0;<br />memset(head,-1,sizeof(head));<br />for (i = 0; i < m; i++) {<br />scanf("%d %d %d", &u[i], &v[i], &w);<br />ww = 500000+i+(long long)500000*1001*w;<br />add(u[i], v[i], ww);<br />}<br />ans = Dinic();<br />memset(incut,0,sizeof(incut));<br />DFS(S);<br />cout << ans/(500000*1001) <<" "<< ans%(500000*1001)/500000 << endl;<br />for (i = 0; i < m; i++)<br />if (incut[u[i]] && !incut[v[i]])<br />printf("%d/n", i+1);<br />return 0;<br />}</p><p>void add(int u, int v, long long f) {<br />e[M].u = u;<br />e[M].v = v;<br />e[M].f = f;<br />e[M].next = head[u];<br />head[u] = M++;</p><p>e[M].u = v;<br />e[M].v = u;<br />e[M].f = 0;<br />e[M].next = head[v];<br />head[v] = M++;</p><p>//cout << u << " " << v << endl;<br />}</p><p>bool BFS() {<br />queue<int> Q;<br />while (!Q.empty()) Q.pop();<br />memset(d,-1,sizeof(d));<br />d[S] = 0; Q.push(S);<br />while (!Q.empty()) {<br />int x = Q.front(); Q.pop();<br />for (int i = head[x]; i != -1; i = e[i].next)<br />if (e[i].f && d[e[i].v] == -1) {<br />d[e[i].v] = d[x]+1;<br />if (e[i].v == T) return true;<br />Q.push(e[i].v);<br />}<br />}<br />return false;<br />}</p><p>long long Dinic() {<br />long long flow, curr;<br />int i, k;<br />bool flag;<br />memset(pre,-1,sizeof(pre));<br />for (flow = 0; BFS(); ) {<br />memcpy(h, head, sizeof(head));<br />for (i = S; ; ) {<br />if (i == T) {<br />curr = INF;<br />for (k = pre[T]; k != -1; k = pre[e[k].u])<br />if (e[k].f < curr) curr = e[k].f;<br />for (k = pre[T]; k != -1; k = pre[e[k].u])<br />e[k].f -= curr,<br />e[k^1].f += curr;<br />flow += curr;<br />//cout << curr << endl;<br />}<br />for (flag = false, k = h[i]; k != -1; k = e[k].next)<br />if (e[k].f && d[i]+1==d[e[k].v]) {<br />pre[e[k].v] = k; h[i] = k;<br />i = e[k].v; flag = true; break;<br />}<br />if (!flag) {<br />d[i] = -1;<br />if (i == S) break;<br />i = e[pre[i]].u;<br />}<br />}<br />}<br />return flow;<br />}</p><p>void DFS(int x) {<br />incut[x] = 1;<br />for (int i = head[x]; i != -1; i = e[i].next)<br />if (e[i].f && !incut[e[i].v])<br />DFS(e[i].v);<br />}<br />
題目三: Frame Up
** Desctiption: 給定矩形字母框的覆蓋效果,按字典序求出所有的可能覆蓋順序
** Algorithm: Toposort
** Analysis: 題目保證了四條邊框至少有一個點是可見的,所以可以確定每個字母框的範圍
然後如果在一個字母框上有其它字母,則連一條有向邊,最後TOPO輸出
#include <iostream><br />#include <cstdio><br />#include <stdio.h><br />#include <string.h><br />using namespace std;<br />struct RECT {<br />int x1, y1, x2, y2;<br />bool yes;<br />RECT() {<br />yes = false;<br />x1 = y1 = 100;<br />x2 = y2 = -1;<br />}<br />} rec[26];<br />bool con[26][26]={0};<br />char map[40][40];<br />char path[30] = {0};<br />int n, m, i, j, cnt, ii, jj;<br />int in[30]={0};<br />void add(int u, int v) {<br />if (!con[u][v]) {<br />con[u][v] = 1;<br />//printf("%d %d/n", u, v);<br />in[v]++;<br />}<br />}<br />void toposort(int d, int pre) {<br />path[d-1] = 'A'+pre;<br />rec[pre].yes = 0 ;<br />if (d == cnt) {<br />printf("%s/n", path);<br />rec[pre].yes = 1;<br />return;<br />};<br />for (int i = 0; i < 26; i++)<br />if (con[pre][i]) in[i]--;<br />for (int i = 0; i < 26; i++)<br />if (rec[i].yes&&!in[i]) toposort(d+1, i);<br />for (int i = 0; i < 26; i++)<br />if (con[pre][i]) in[i]++;<br />rec[pre].yes = 1;<br />}<br />int main(){<br />freopen("frameup.in", "r", stdin);<br />freopen("frameup.out", "w", stdout);<br />scanf("%d %d/n", &n, &m);<br />for (i = 0; i < n; i++) {<br />cin.getline(map[i], 100);<br />for (j = 0; j < m; j++)<br />if (map[i][j] != '.') {<br />int k = map[i][j]-'A';<br />rec[k].yes = true;<br />if (i < rec[k].x1) rec[k].x1 = i;<br />if (j < rec[k].y1) rec[k].y1 = j;<br />if (i > rec[k].x2) rec[k].x2 = i;<br />if (j > rec[k].y2) rec[k].y2 = j;<br />}<br />}<br />cnt = 0;<br />for (i = 0; i < 26; i++)<br />if (rec[i].yes) {<br />cnt++;<br />int k = 'A'+i;<br />for (ii = rec[i].x1; ii <= rec[i].x2; ii++) {<br />if (map[ii][rec[i].y1] != k) add(i, map[ii][rec[i].y1]-'A');<br />if (map[ii][rec[i].y2] != k) add(i, map[ii][rec[i].y2]-'A');<br />}<br />for (jj = rec[i].y1+1; jj <= rec[i].y2-1; jj++) {<br />if (map[rec[i].x1][jj] != k) add(i, map[rec[i].x1][jj]-'A');<br />if (map[rec[i].x2][jj] != k) add(i, map[rec[i].x2][jj]-'A');<br />}<br />}<br />//printf("%d/n",cnt);<br />for (i = 0; i < 26; i++)<br />if (rec[i].yes && !in[i]) toposort(1, i);//next is 1, pre is i<br />return 0;<br />}