#include<cstdio>
#include<memory>
using namespace std;
const int MAX = 10001;
bool map[MAX][MAX],visit[MAX];
int match[MAX];
int a, b;
bool DFS(int i)
{
int j, k = 1;
for(j = 1 ; j <= b; j++)
{
if(map[i][j] && !visit[j])
{
visit[j] = true;
k = match[j];
match[j] = i;
if(k == 0 || DFS(k))
return true;
match[j] = k;
}
}
return false;
}
int Hungary()
{
int j, ans = 0;
memset(match, 0, sizeof(match));
for(j = 1; j <= a; j++)
{
memset(visit,false, sizeof(visit));
if(DFS(j))
ans++;
}
return ans;
}
int main()
{
int i, j, n,ans;
memset(map,false,sizeof(map));
scanf("%d%d",&a,&b);
ans = Hungary();
printf("%d\n",ans);
return 0;
}
posted @
2006-10-24 18:34 beyonlin 阅读(1345) |
评论 (1) |
编辑 收藏
转自:http://blog.csdn.net/liu_tang/archive/2006/08/01/1008611.aspx
函数名: scanf
功 能: 执行格式化输入
用 法: int scanf(char *format[,argument,...]);
scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
其调用格式为: scanf("<格式化字符串>",<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
其控制串由三类字符构成:
1。格式化说明符;
2。空白符;
3。非空白符;
(A) 格式化说明符
格式字符 说明
%a 读入一个浮点值(仅C99有效)
%A 同上
%c 读入一个字符
%d 读入十进制整数
%i 读入十进制,八进制,十六进制整数
%o 读入八进制整数
%x 读入十六进制整数
%X 同上
%c 读入一个字符
%s 读入一个字符串
%f 读入一个浮点数
%F 同上
%e 同上
%E 同上
%g 同上
%G 同上
%p 读入一个指针
%u 读入一个无符号十进制整数
%n 至此已读入值的等价字符数
%[] 扫描字符集合
%% 读%符号
posted @
2006-10-18 22:51 beyonlin 阅读(782) |
评论 (0) |
编辑 收藏
istringstream对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开来。
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
string str, line;
while(getline(cin, line))
{
istringstream stream(line);
while(stream>>str)
cout<<str.c_str()<<endl;
}
return 0;
}
测试:
input:
abc df e efgeg ffg
ouput:
abc
df
e
efgeg
ffg
posted @
2006-10-17 00:37 beyonlin 阅读(19284) |
评论 (3) |
编辑 收藏
#include<cstdio>
const int MAX = 10000;
const int INF = 1000000;
int clo[MAX];
int low[MAX];
int c[MAX][MAX];
bool flag[MAX];
int beg[MAX],end[MAX];//记录生成树的每条边的两个顶点
int Prim(int n)
{
int i, j, k, ans = 0, pair = 0;
flag[1] = true;
for(i = 2; i <= n; i++)
{
low[i] = c[1][i];
clo[i] = 1;
flag[i] = false;
}
for(i = 1; i < n; i++)
{
j = 1;
int min = INF;
for(k = 2; k <=n; k++)
{
if(low[k] < min && !flag[k])
{
min = low[k];
j = k;
}
}
flag[j] = true;
beg[i] = j;
end[i] = clo[j];
ans += c[j][clo[j]];
for(k = 2; k <= n; k++)
{
if(c[j][k] < low[k] && !flag[k])
{
low[k] = c[j][k];
clo[k] = j;
}
}
}
return ans;
}
int main()
{
int i, j, n, m;
scanf("%d%d",&n,&m);
for(i = 1; i <= n; i++)
{
for(j = 1; j <=n; j++)
{
c[i][j]=INF;
}
}
return 0;
}
posted @
2006-10-13 23:48 beyonlin 阅读(3063) |
评论 (4) |
编辑 收藏
#include<cstdlib>
#include<cstdio>
int main()
{
int num = 10;
char str[100];
itoa(num, str, 2);
printf("%s\n", str);
return 0;
}
itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是目标字符串,第三个参数是转移数字时所用 的基数。在上例中,转换基数为10。10:十进制;2:二进制……
于是想到了一个十进制转二进制的方法:
#include<cstdlib>
#include<cstdio>
int main()
{
int num = 10;
char str[100];
int n = atoi(itoa(num, str, 2));
printf("%d\n",n);
return 0;
}
先把num转换为二进制的字符串,再把该字符串转换为整数。
posted @
2006-10-12 00:59 beyonlin 阅读(67434) |
评论 (14) |
编辑 收藏