POJ 1325(最小点覆盖)
这个题,就不用说什么了吧,最裸的最小点覆盖。
View Code
1 #include <cstdlib> 2 #include <cstdio> 3 #include <cstring> 4 #define M 1000000 5 using namespace std; 6 int head[M],next[M],to[M],linky[M],m,bk,n,cnt; 7 bool vis[M]; 8 inline void add(int u,int v) 9 { 10 to[cnt]=v; next[cnt]=head[u]; head[u]=cnt++; 11 } 12 void read() 13 { 14 scanf("%d%d",&m,&bk); 15 memset(head,-1,sizeof head); 16 cnt=0; 17 for(int i=1,a,b,c;i<=bk;i++) 18 { 19 scanf("%d%d%d",&a,&b,&c); 20 if(b&&c) add(b,c); 21 } 22 } 23 bool dfs(int u) 24 { 25 for(int i=head[u];~i;i=next[i]) 26 if(!vis[to[i]]) 27 { 28 vis[to[i]]=true; 29 if(linky[to[i]]==-1||dfs(linky[to[i]])) 30 { 31 linky[to[i]]=u; 32 return true; 33 } 34 } 35 return false; 36 } 37 void go() 38 { 39 int ans=0; 40 memset(linky,-1,sizeof linky); 41 for(int i=1;i<=n;i++) 42 { 43 memset(vis,0,sizeof vis); 44 if(dfs(i)) ans++; 45 } 46 printf("%d\n",ans); 47 } 48 int main() 49 { 50 while(scanf("%d",&n),n) 51 { 52 read(); 53 go(); 54 } 55 return 0; 56 }
没有人能阻止我前进的步伐,除了我自己!