(1,1),(1,1),(2,2)不是乙個合法猜測(有相同的格仔),因此不管怎麼猜總是能全部猜中。
給定了若干個標準點,用這些點的橫縱座標分為x集和y集,定義猜點表示從x集和y集中各選乙個,不能猜出重複的點,問在所有合法方案中最少包含上述幾個標準點。
我們看到了這道題目,考慮從費用流的方法下手。
我們從s->x集:容量為數字出現次數,費用為0;y集->t:容量為數字出現次數,費用為0;x集->y集:容量為1,若組合成了標準點則費用為1,否則為0。
然後我們這樣連邊,又由於題目要的是最少包含幾個點,那麼顯然最小費用最大流就是答案了。
1 #include2 #include3 #include4 #include5 #include6 #include7view codeusing
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 }
網路流 費用流
這個好像不考 沒事可以騙分 費用流,顧名思義,就是有費用的流,也就是說,給乙個網路流圖中的每條弧增加乙個單位流量費用。一般來說求解的費用流都是最大流最小費用。好像沒什麼好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...