Foreign 猜測 費用流

2022-05-20 07:33:22 字數 2239 閱讀 4228

(1,1),(1,1),(2,2)不是乙個合法猜測(有相同的格仔),因此不管怎麼猜總是能全部猜中。

給定了若干個標準點,用這些點的橫縱座標分為x集和y集,定義猜點表示從x集和y集中各選乙個,不能猜出重複的點,問在所有合法方案中最少包含上述幾個標準點。

我們看到了這道題目,考慮從費用流的方法下手。

我們從s->x集:容量為數字出現次數,費用為0y集->t:容量為數字出現次數,費用為0x集->y集:容量為1,若組合成了標準點則費用為1,否則為0

然後我們這樣連邊,又由於題目要的是最少包含幾個點,那麼顯然最小費用最大流就是答案了。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;89

const

int one = 2000001;10

const

int inf = 2147483640;11

12int

n,x,y;

13int

s,t;

14int e[1001][1001

];15

int next[one],first[one],go[one],pas[one],fro[one],tot=1;16

intfrom[one],q[1000001],dist[200001

];17

bool

vis[one];

18int

tou,wei;

19int

ans,w[one];

20int

li[one],li_num;

2122

struct

power

23a[one],time[one],max;

2627

intget

() 28

3738

void add(int u,int v,int liu,int

z)39 43

44int

bfs()

4563}64

}65 vis[u]=0;66

}67return dist[t]!=dist[t+10

];68}69

70void

deal()

7180}81

82int

main()

8390

91 sort(li+1,li+li_num+1

);92 li_num = unique(li+1,li+li_num+1) - li - 1

;93 s=0; t=2*li_num+1;94

95for(int i=1;i<=n;i++)

96103

104for(int i=1;i<=max.x;i++) if(time[i].x) add(s,i,time[i].x,0

);105

for(int i=1;i<=max.y;i++) if(time[i].y) add(i+max.x,t,time[i].y,0

);106

107for(int i=1;i<=max.x;i++)

108if

(time[i].x)

109for(int j=1;j<=max.y;j++)

110if

(time[j].y)

111115

116while

(bfs()) deal();

117118 printf("%d"

,ans);

119120 }

view code

網路流 費用流

這個好像不考 沒事可以騙分 費用流,顧名思義,就是有費用的流,也就是說,給乙個網路流圖中的每條弧增加乙個單位流量費用。一般來說求解的費用流都是最大流最小費用。好像沒什麼好bb的 這裡推薦使用zkw演算法求解最小費用流,看著 理解就行,應該還是很好理解的。zkw演算法在稠密圖上跑得飛快,在稀疏圖上還不...

網路流 費用流

網路流有很多種類 其中最大流 有增廣路演算法和預流推進演算法。增廣路演算法就是不斷的新增增廣路。其中的dinic演算法。會稍微提到isap演算法 poj1273 首先想到dfs一直往後延伸,然後從源點到匯點計算每條路,但是這樣只是單條路的最值,有時可能因為走一條路而間接的認定了除這條路以外的某個路通...

費用流模板

const int oo 1e9 無窮 const int mm 11111111 邊 const int mn 888888 點 int node,src,dest,edge int ver mm flow mm cost mm nex mm int head mn dis mn p mn q m...