hdu 1150 最小点覆盖

题目大意;有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。 如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi。 每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。
 
注意状态为0的即可
 1 #include<cstdio>

 2 #include<algorithm>

 3 #include<cstring>

 4 using namespace std;

 5 const int MAXN = 510;

 6 int uN,vN;//u,v的数目,使用前面必须赋值

 7 int g[MAXN][MAXN];//邻接矩阵

 8 int linker[MAXN];

 9 bool used[MAXN];

10 bool dfs(int u)

11 {

12     for(int v = 0; v < vN;v++)

13     if(g[u][v] && !used[v])

14     {

15         used[v] = true;

16         if(linker[v] == -1 || dfs(linker[v]))

17         {

18             linker[v] = u;

19             return true;

20         }

21     }

22     return false;

23 }

24 int hungary()

25 {

26     int res = 0;

27     memset(linker,-1,sizeof(linker));

28     for(int u = 0;u < uN;u++)

29     {

30         memset(used,false,sizeof(used));

31         if(dfs(u))res++;

32     }

33     return res;

34 }

35 int main()

36 {

37     int i,j,k;

38     //freopen("1.in","r",stdin);

39     while(scanf("%d",&uN)!=EOF)

40     {

41         if(uN==0)   break;

42         scanf("%d%d",&vN,&k);

43         int p,q;

44         memset(g,0,sizeof(g));

45         while(k--)

46         {

47             scanf("%d%d%d",&i,&p,&q);

48             if(p>0&&q>0)    g[p][q]=1;

49         }

50         printf("%d\n",hungary());

51     }

52     return 0;

53 }

 

你可能感兴趣的:(HDU)