Gym - 101490J Programming Tutors

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym - 101490J Programming Tutors相关的知识,希望对你有一定的参考价值。


题目链接:​​https://vjudge.net/problem/Gym-101490J​​​
题意:有n个学生,每个学生有一个坐标代表位置,有n个老师,每个老师有一个坐标代表位置,他们之间需要互相配对,每对之间的价值为他们之间的曼哈顿距离,现在要你找一种配对方式使得他们之间的最大价值最小,输出这个最小值
解析:由于是配对,所以应该很容易想到二分图匹配,匈牙利原理是每次都找增广路,这个也是一样的,从第一个顶点增广路,记录增广路上的最大值,匹配完后和ans取一下最小即可

#include <bits/stdc++.h>
using namespace std;
const int maxn = 205;
const int inf = 0x7fffffff;
struct node

int x,y;
a[maxn],b[maxn];
int mapple[maxn][maxn];
int vis[maxn],res,ans;
vector<int>G[maxn*maxn];
void dfs(int x,int cnt,int n)

if(cnt==n)

ans = min(ans,res);
return ;

for(int i=0;i<(int)G[x].size();i++)

int y = G[x][i];
if(vis[y]) continue;
vis[y] = 1;
int tmp = res;
res = max(res,mapple[x][y]);
dfs(y,cnt+1,n);
res = tmp;
vis[y] = 0;


int main(void)

int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d %d",&a[i].x,&a[i].y);
for(int i=0;i<n;i++)
scanf("%d %d",&b[i].x,&b[i].y);
for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

int tmp = abs(a[i].x-b[i].x)+abs(a[i].y-b[i].y);
G[i].push_back(j+n);
G[j+n].push_back(i);
mapple[i][j+n] = tmp;
mapple[j+n][i] = tmp;


ans = inf;
vis[0] = 1;
dfs(0,0,n);
printf("%d\\n",ans);
return 0;


以上是关于Gym - 101490J Programming Tutors的主要内容,如果未能解决你的问题,请参考以下文章

Gym .101933 Nordic Collegiate Programming Contest (NCPC 2018) (寒假gym自训第四场)

Galactic Collegiate Programming Contest Gym - 101572G 模拟

gym101532 2017 JUST Programming Contest 4.0

(寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest

(寒假GYM开黑)2018 German Collegiate Programming Contest (GCPC 18)

(寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)