hdu 1281 二分匹配
2012-07-25 19:27
561 查看
题意:
在图上给出一些点,安放车,让其不相互攻击,求车的最大值!!并求出那些点不可代替!!
构图:
将各自的x,y坐标提出了,建立边!!xi,yi边的匹配的最大值就是车的数量!!!删除每条边,如果车的数量有所减少则是不可替代的车!!
代码:
在图上给出一些点,安放车,让其不相互攻击,求车的最大值!!并求出那些点不可代替!!
构图:
将各自的x,y坐标提出了,建立边!!xi,yi边的匹配的最大值就是车的数量!!!删除每条边,如果车的数量有所减少则是不可替代的车!!
代码:
#include<iostream> #include<cstdio> #include<memory.h> #include<algorithm> using namespace std; int vis[102],mat[102]; int n,m,k,tx,ty,x[102],y[102]; int f[1002][1002]; int find(int x) { for(int i=f[x][0]; i>=1; i--) { int y=f[x][i]; if(!vis[y]) { if(x==tx&&y==ty) continue; vis[y]=1; if(mat[y]==-1||find(mat[y])) { mat[y]=x; return 1; } } } return 0; } int main () { int i,j,t; int m,n,k,ans,cas=1; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { memset(f,0,sizeof(f)); memset(mat,-1,sizeof(mat)); ans=0; int Max=0; tx=-1,ty=-1; for(i=1; i<=k; i++) { scanf("%d %d",&x[i],&y[i]); f[x[i]][++f[x[i]][0]]=y[i]; } for(i=1; i<=n; i++) { memset(vis,0,sizeof(vis)); if(find(i)) Max++; } int imp=0; for(i=1; i<=n; i++) { for(t=f[i][0]; t>=1; t--) { memset(mat,-1,sizeof(mat)); ans=0; tx=i;ty=f[i][t]; for(j=1; j<=n; j++) { memset(vis,0,sizeof(vis)); if(find(j))ans++; } if(ans<Max) imp++; } } printf("Board %d have %d important blanks for %d chessmen.\n",cas++,imp,Max); } return 0; } /* 3 3 4 1 2 1 3 2 1 2 2 3 3 4 1 2 2 3 2 1 3 2 */
相关文章推荐
- hdu1281 二分匹配
- hdu 1281 棋盘游戏 (二分匹配)
- 二分匹配_HDU_1281
- hdu 1281棋盘游戏(二分匹配)
- hdu 1281 棋盘游戏(二分匹配)
- hdu 1281 棋盘游戏 二分匹配
- HDU1281-棋盘游戏-二分匹配与增广链
- HDU1281 二分匹配
- hdu 1281 棋盘游戏【二分匹配】
- HDU-1281(二分匹配_必要边)
- HDU 1281 棋盘游戏 二分匹配 匈牙利算法
- HDU 1281 棋盘游戏-二分匹配
- 二分图匹配——棋盘游戏 ( HDU 1281 )
- HDU 1281 棋盘游戏(匈牙利算法 二分最大匹配)
- 二分匹配-hdu-1281
- hdu1281棋盘游戏(二分匹配,最小顶点覆盖)
- HDU-1281-棋盘游戏 [二分匹配][关键匹配]
- hdu 1281 棋盘游戏(二分匹配)
- hdu 1281 棋盘游戏【二分匹配+暴力枚举】
- HDU 1281 棋盘游戏(二分匹配 与 删边)