pku2536 Gopher II

来源:互联网 发布:java jni 参数 编辑:程序博客网 时间:2024/06/01 08:10

题目链接:pku2536

方法:最大匹配

思想:本地要求的是最小有多少只地鼠容易受到攻击,可以先通过求最大匹配,
然后用地鼠数目减去最大匹配数即为答案。地鼠与洞进行最大匹配构图时,
若地鼠走到该洞的时间小于等于规定时间就赋为1,否则为0.

代码:

#include <iostream>#include <cmath> using namespace std;#define MAX 105         //二部图一侧顶点的最大个数int n,m,match[MAX];     //二分图的两个集合分别含有n和m个元素。bool visit[MAX],map[MAX][MAX]; //map存储邻接矩阵。bool DFS(int k){   int t;    for(int i = 0; i < m; i++)    {     if(map[k][i] && !visit[i])          {    visit[i] = true;    t = match[i];    match[i] = k;   //路径取反操作。               if(t == -1 || DFS(t))  return true;   //整个算法的核心部分               match[i] = t;          }     }     return false;}int Max_match (){     int ans = 0,i;      memset(match, -1, sizeof(match));      for(i = 0; i < n; i++)      {    memset(visit,0,sizeof(visit));           if(DFS(i))   ans++;      }      return ans;}struct point {double x,y; };double dist(point a,point b){  return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); }const double eps=1e-10;int main(int argc, char *argv[]){int s,v;point gopher[MAX];while(cin>>n>>m>>s>>v){memset(map,0,sizeof(map));int i,j;for(i=0;i<n;i++)cin>>gopher[i].x>>gopher[i].y;for(i=0;i<m;i++){point hole;cin>>hole.x>>hole.y;for(j=0;j<n;j++)if(dist(gopher[j],hole)/v-s<eps)map[i][j]=1;}cout<<n-Max_match()<<endl;}return 0;}


原创粉丝点击