标签:des style c class blog code
Time Limit: 20000/10000 MS
(Java/Others) Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s): 4697 Accepted
Submission(s): 2125
题意:求最少要多少个士兵站岗可使全部点都能观察得到。
因为是树形结构,每个点都会有一条边,最大匹配数即为题解(不证明了..)。
和 hdu1068 差不多,一样的模板,不过这题是求最大匹配数,匈牙利后结果除二即为解。
1 //234MS 280K 1166 B C++ 2 #include<stdio.h> 3 #include<string.h> 4 #define N 1505 5 struct node{ 6 int v; 7 int next; 8 }edge[10*N]; 9 int match[N]; 10 int vis[N]; 11 int head[N]; 12 int n,edgenum; 13 void addedge(int u,int v) 14 { 15 edge[edgenum].v=v; 16 edge[edgenum].next=head[u]; 17 head[u]=edgenum++; 18 } 19 int dfs(int x) 20 { 21 for(int i=head[x];i!=-1;i=edge[i].next){ 22 int v=edge[i].v; 23 if(!vis[v]){ 24 vis[v]=1; 25 if(match[v]==-1 || dfs(match[v])){ 26 match[v]=x; 27 return 1; 28 } 29 } 30 } 31 return 0; 32 } 33 int hungary() 34 { 35 int ret=0; 36 memset(match,-1,sizeof(match)); 37 for(int i=0;i<n;i++){ 38 memset(vis,0,sizeof(vis)); 39 ret+=dfs(i); 40 } 41 return ret; 42 } 43 int main(void) 44 { 45 int a,b,m; 46 while(scanf("%d",&n)!=EOF) 47 { 48 edgenum=0; 49 memset(head,-1,sizeof(head)); 50 for(int i=0;i<n;i++){ 51 scanf("%d:(%d)",&a,&m); 52 while(m--){ 53 scanf("%d",&b); 54 addedge(a,b); 55 addedge(b,a); 56 } 57 } 58 printf("%d\n",hungary()/2); 59 } 60 return 0; 61 }
hdu 1054 Strategic Game (二分匹配),布布扣,bubuko.com
hdu 1054 Strategic Game (二分匹配)
标签:des style c class blog code
原文地址:http://www.cnblogs.com/GO-NO-1/p/3745920.html