标签:ber log 位置 tail 状态 坐标 oss 入队 最小
题目链接:
http://poj.org/problem?id=3041
Description
Input
Output
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2
Hint
1 #include<stdio.h> 2 #include<string.h> 3 int n,k,e[510][510],pred[510],queue[250000],cx[510],cy[510]; 4 int maxmatch(); 5 int main() 6 { 7 int i,x,y; 8 while(scanf("%d%d",&n,&k) != EOF) 9 { 10 memset(e,0,sizeof(e)); 11 for(i=1;i<=k;i++) 12 { 13 scanf("%d%d",&x,&y); 14 e[x][y]=1; 15 } 16 printf("%d\n",maxmatch());//输出最小顶点覆盖数 17 } 18 return 0; 19 } 20 int maxmatch() 21 { 22 int i,j,y; 23 int cur,tail,res=0; 24 memset(cx,0xff,sizeof(cx)); 25 memset(cy,0xff,sizeof(cy)); 26 27 for(i=1;i<=n;i++) 28 { 29 if(cx[i] != -1)//找到x集合中每个未盖点i进行一次找交错轨 30 continue; 31 32 for(j=1;j<=n;j++) 33 pred[j]=-2;//初始化为-2 34 35 cur=0;//队列初始化 36 tail=0; 37 38 for(j=1;j<=n;j++)//将i的邻接顶点加入队列 39 { 40 if(e[i][j]) 41 { 42 pred[j]=-1;//-1表示遍历到,是邻接顶点 43 queue[tail++]=j; 44 } 45 } 46 47 while(cur < tail)//BFS 48 { 49 y=queue[cur]; 50 if(cy[y]==-1) 51 break;//找到了一个未匹配的点,则找到了一条交错轨 52 cur++; 53 //已经匹配给cy[y]了,从cy[y]出发,将其邻接点加入队列 54 for(j=1;j<=n;j++) 55 { 56 if(pred[j] == -2 && e[ cy[y ]][j]) 57 { 58 pred[j]=y; 59 queue[tail++]=j; 60 } 61 } 62 } 63 if(cur == tail)//没有找到交错轨 64 continue; 65 66 while(pred[y] > -1)//更改交错轨上的匹配状态 67 { 68 cx[ cy[pred[y]] ] = y; 69 cy[y]=cy[ pred[y] ]; 70 y=pred[y]; 71 } 72 cy[y]=i; 73 cx[i]=y; 74 75 res++;//匹配数加1 76 } 77 return res; 78 }
POJ 3041 Asteroids(模板——二分最大匹配(BFS增广))
标签:ber log 位置 tail 状态 坐标 oss 入队 最小
原文地址:http://www.cnblogs.com/wenzhixin/p/7363159.html