UVA 10888 km 题库61页
来源:互联网 发布:欧文生涯数据统计 编辑:程序博客网 时间:2024/05/23 01:17
注意求最小值的方法。
const int maxn = 108 ;int lx[maxn] , ly[maxn] ;int Left[maxn] ;int w[maxn][maxn] ;bool S[maxn] , T[maxn] ;int n ;bool match(int i){ S[i] = 1 ; for(int j = 1 ; j <= n ; j++){ if(!T[j] && lx[i] + ly[j] == w[i][j]){ T[j] = 1 ; if(!Left[j] || match(Left[j])){ Left[j] = i ; return 1 ; } } } return 0 ;}void update(){ int a = 1<<30 ; for(int i = 1 ; i <= n ; i++){ if(S[i]){ for(int j = 1 ; j <= n ; j++){ if(! T[j]) a = min(a , lx[i]+ly[j]-w[i][j]) ; } } } for(int i = 1 ; i <= n ; i++){ if(S[i]) lx[i] -= a ; if(T[i]) ly[i] += a ; }}int km(){ for(int i = 1 ; i <= n ; i++){ Left[i] = lx[i] = ly[i] = 0 ; for(int j = 1 ; j <= n ; j++) lx[i] = max(lx[i] , w[i][j]) ; } for(int i = 1 ; i <= n ; i++){ while(1){ for(int j = 1 ; j <= n ; j++) S[j] = T[j] = 0 ; if(match(i)) break ; else update() ; } } int s = 0 ; for(int i = 1 ; i <= n ; i++) s += w[Left[i]][i] ; return s ;}char g[48][48] ;int N , M ;int can(int x , int y){ return 1 <= x && x <= N && 1 <= y && y <= M ;}int d[4][2] = {{-1,0},{0,-1},{1,0},{0,1}} ;int dist[48][48] ;bool in[48][48] ;vector<pair<int , int> > lisx , lisb ;void bfs(int sx , int sy , int id){ queue< pair<int ,int> > q ; q.push(make_pair(sx,sy)) ; memset(dist , 63 , sizeof(dist)) ; dist[sx][sy] = 0 ; in[sx][sy] = 1 ; while(! q.empty()){ pair<int , int> now = q.front() ; q.pop() ; in[now.first][now.second] = 0 ; for(int i = 0 ; i < 4 ; i++){ int x = now.first + d[i][0] ; int y = now.second + d[i][1] ; if(! can(x , y) || g[x][y] == '#') continue ; if(dist[x][y] > dist[now.first][now.second] + 1){ dist[x][y] = dist[now.first][now.second] + 1 ; if(!in[x][y]){ in[x][y] = 1 ; q.push(make_pair(x , y)) ; } } } } for(int i = 0 ; i < lisb.size() ; i++){ w[id][i+1] = min(w[id][i+1] , dist[lisb[i].first][lisb[i].second]) ; }}int main(){ int t , i , j , b , x ; cin>>t ; while(t--){ cin>>N>>M ; for(i = 1 ; i <= N ; i++) scanf("%s" , g[i]+1) ; lisx.clear() ; lisb.clear() ; for(i = 1 ; i <= N ; i++){ for(j = 1 ; j <= M ; j++){ if(g[i][j] == 'B') lisb.push_back(make_pair(i , j)) ; else if(g[i][j] == 'X') lisx.push_back(make_pair(i , j)) ; } } n = lisb.size() ; memset(w , 63 , sizeof(w)) ; for(i = 0 ; i < lisx.size() ; i++){ bfs(lisx[i].first , lisx[i].second , i+1) ; } for(i = 1 ; i <= n ; i++) for(j = 1 ; j <= n ; j++){ w[i][j] = -w[i][j] ; } cout<< -km() << endl ; } return 0 ;}
0 0
- UVA 10888 km 题库61页
- Uva 10888 Warehouse(KM)
- UVA 10617 dp 题库210页
- POJ 3565 KM算法 题库221
- UVa 1411 Ants(KM)
- UVA 11383 KM性质
- UVa:1411 Ants(KM算法)
- UVA-11383 (KM算法)
- hdu 3488(uva 1349)(KM)
- UVa:11383 Golden Tiger Claw(KM算法)
- uva 11780 - Miles 2 Km(dp+Fibonacci)
- 【UVA】11383 Golden Tiger Claw KM匹配
- km
- KM
- 【KM】
- KM
- KM
- 题库
- 初探unix核心
- WinDbg 命令集锦
- 4.一个球从100m高度自由落下,每次落地后反跳回原来高度的一半,再落下,再反弹。求它在第10次落地时,共经过多少米?第10次反弹多高。
- cycle,reverse,rotate linked list
- Poj 3692 Kindergarten 二分图最大独立点集
- UVA 10888 km 题库61页
- (韩顺平讲解)pl/sql编程(一)
- jsp中找不到jquery.js文件解决办法
- 1833. The Hardest Problem Ever
- 更改谷歌浏览器缓存位置的方法
- 【Android】 - CentOS6.5 系统搭建 Android 开发环境
- 人工智能的复杂分析系统·
- Android的View和ViewGroup深入分析
- 程序员成长历程的四个阶段