POJ3041 - Asteroids
来源:互联网 发布:关于数据爆炸 编辑:程序博客网 时间:2024/05/22 16:22
此题说难也难说简单也简单。关键就看有没有理解这样的一条定理:
最小点覆盖数=最大匹配数
解题思路如下:
1、以行和列分别建立两个顶点集V1,V2
2、将障碍物(x1,y1)视为两个顶点集中的两点V1(x1),V2(y1)的边
3、求V1和V2的最大二分匹配,由最小点覆盖数=最大匹配数可知,此即为答案(the minimum number of times Bessie must shoot)
//Memory Time//956K0MS#include<stdio.h>int edge[501][501];int edgeNum[501];int couple[501];bool isVisited[501];bool isHoped[501];int search(int N);bool dfs(int src);int main(){int N, K;scanf("%d %d", &N, &K);for(int i = 1; i <= N; i++){edgeNum[i] = 0;couple[i] = -1;isVisited[i] = 0;isHoped[i] = 1;}for(int i = 0; i < K; i++){int src,dst;scanf("%d %d", &src, &dst);edge[src][edgeNum[src]] = dst;edgeNum[src]++;}printf("%d\n", search(N));return 0;}int search(int N){int temp = 0;for(int i = 1; i <= N; i++){for(int j = 1; j <= N; j++){isVisited[j] = 0;}if(dfs(i))temp++;}return temp;}bool dfs(int src){int tempNum = edgeNum[src];for(int i = 0; i < tempNum; i++){int tempDst = edge[src][i];if(isVisited[tempDst] == 0 && isHoped[tempDst]){isVisited[tempDst] = 1;if(couple[tempDst] == -1){couple[tempDst] = src;return 1;}else{if(dfs(couple[tempDst])){couple[tempDst] = src;return 1;}else{isHoped[tempDst] = 0;}}}}return 0;}
0 0
- POJ3041 Asteroids
- poj3041 asteroids
- poj3041 Asteroids
- POJ3041----Asteroids
- poj3041 - Asteroids
- Asteroids poj3041
- POJ3041 Asteroids
- poj3041 Asteroids
- poj3041 Asteroids
- POJ3041:Asteroids
- poj3041 Asteroids
- POJ3041 - Asteroids
- POJ3041 Asteroids
- Asteroids poj3041
- poj3041 Asteroids
- poj3041 Asteroids
- POJ3041-Asteroids
- POJ3041-Asteroids
- 有梦才可以到达远方
- ArcMap10 生成MSD文档
- c#初步
- Flash Builder中修改字体
- 黑马程序员-单例设计模式线程安全
- POJ3041 - Asteroids
- C#使用GetPrivateProfileString取得INI文件中的值
- linux maven伺服器nexus工作目录修改
- mac 10.9 下编译boost
- MAC OSX10.9 下编译使用OGRE1.9及CEGUI 0.8.3(二)OGRE Templates的使用
- linux下socket编程实例
- java.lang.reflect学习
- IOS socket编程--Asyncsocket(转)
- SpringMVC学习系列(9) 之 实现注解式权限验证