hdu 3722 2010 Asia Tianjin Regional Contest Card Game KM

感觉建图复杂度过大啊,但还是AC了。。。

View Code
  1 #include<stdio.h>
2 #include<string.h>
3 char str[210][1010];
4 int map[210][210];
5 int min(int a,int b){return a<b?a:b;}
6 const int inf = 9999999;
7 int n,match[210];
8 bool sx[210],sy[210];
9 int lx[210],ly[210];
10 bool path(int u)
11 {
12 sx[u]=true;
13 for(int v=0;v<n;v++)
14 if(!sy[v]&&lx[u]+ly[v]==map[u][v])
15 {
16 sy[v]=true;
17 if(match[v]==-1||path(match[v]))
18 {
19 match[v]=u;
20 return true;
21 }
22 }
23 return false;
24 }
25 int KM(int n)
26 {
27 int i,j;
28 for(i=0;i<n;i++)
29 {
30 lx[i]=-inf;
31 ly[i]=0;
32 for(j=0;j<n;j++)
33 if(lx[i]<map[i][j])
34 lx[i]=map[i][j];
35 }
36 memset(match,-1,sizeof(match));
37 for(int u=0;u<n;u++)
38 while(1)
39 {
40 memset(sx,0,sizeof(sx));
41 memset(sy,0,sizeof(sy));
42 if(path(u)) break;
43 int dmin=inf;
44 for(i=0;i<n;i++)
45 if(sx[i])
46 for(j=0;j<n;j++)
47 if(!sy[j])
48 dmin=min(lx[i]+ly[j]-map[i][j],dmin);
49 for(i=0;i<n;i++)
50 {
51 if(sx[i]) lx[i]-=dmin;
52 if(sy[i]) ly[i]+=dmin;
53 }
54 }
55 int sum=0;
56 for(j=0;j<n;j++)
57 sum+=map[match[j]][j];
58 return sum;
59 }
60 void map_init(int n)
61 {
62 int i,j;
63 for(i=0;i<n;i++)
64 {
65 for(j=0;j<n;j++)
66 map[i][j]=inf;
67 }
68 }
69 int main()
70 {
71 int i,j,k;
72 while(scanf("%d",&n)!=EOF)
73 {
74 int count;
75 map_init(n);
76 for(i=0;i<n;i++)
77 scanf("%s",str[i]);
78 for(i=0;i<n;i++)
79 {
80 map[i][i]=0;
81 for(j=0;j<n;j++)
82 {
83 if(i!=j)
84 {
85 int len1=strlen(str[i]);
86 int len2=strlen(str[j]);
87 int p=0;
88 count=0;
89 for(k=len1-1;k>=0&&p<len2;k--)
90 {
91 if(str[i][k]==str[j][p])
92 {
93 count++;
94 p++;
95 }
96 else break;
97 }
98 map[i][j]=count;
99 }
100 }
101 }
102 /*for(i=0;i<n;i++)
103 {
104 for(j=0;j<n;j++)
105 printf("%d ",map[i][j]);
106 printf("\n");
107 }*/
108 printf("%d\n",KM(n));
109 }
110 }



posted @ 2011-10-28 20:18  Because Of You  Views(287)  Comments(0Edit  收藏  举报