POJ 1325 Machine Schedule 最小点覆盖 构图!

http://poj.org/problem?id=1325

题目一点都不友好,真没看懂题意,于是乎,以为求最多有多少任务可以完成呢,每个任务向A和B的模型连线。。。题意理解错了,结果肯定对不啊

最后发现就算真的理解了题意,也不会构图,这题算法很一般,反正构图打死我也想不出来,图论难就难在构图上,可能就是这样吧。

题意:机器A有n个模式(编号0~n-1),机器B有m个模式 , k项任务需要A的x模式完成或者B的y模式完成,但是A和B每转换一次模式都要重新启动,

问要完成这k项任务,至少要重新启动机器多少次?注意:开始时,A和B都在模式0上(不需要重新启动,在这WA了一次。。。)

 

打死也想不出的构图,哪位神人想出的涅 :某项任务需要A的x模式或B的y模式完成,就在x和y间连线,一条线表示一项任务,求有多少个点可以把所有的线都

覆盖了。根据koning定理,最小覆盖=最大匹配   还有一点,如果某任务需要A的0模式或B的0模式完成,不需要连线,因为开始A,B的模式都在0上。

开始题意理解错了,还以为会有many many边所以就用加边链表了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#define mMAX  1005
using namespace std;
int link[105],head[105];
bool vis[105];
int n,s_edge;
struct Edge
{
    int to,next;
}edge[mMAX];

void addedge(int u,int v)
{
    s_edge++;
    edge[s_edge].to=v;
    edge[s_edge].next=head[u];
    head[u]=s_edge;
    return ;
}
bool dfs(int u)
{
    for(int e=head[u];e;e=edge[e].next)
    {
        int v=edge[e].to;
        if(!vis[v])
        {
            vis[v]=1;
            if(!link[v]||dfs(link[v]))
            {
                link[v]=u;
                return 1;
            }
        }
    }
    return 0;
}
int MaxMatch()
{
    int SUM=0;
    memset(link,0,sizeof(link));
    for(int i=1;i<n;i++)//0直接舍掉
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i))
        SUM++;
    }
    return SUM;
}

int main()
{
    int lx,m;
    int i,j,d1,d2;
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        scanf("%d%d",&m,&lx);

        s_edge=0;
        memset(head,0,sizeof(head));

        for(i=0;i<lx;i++)
        {
            scanf("%d%d%d",&j,&d1,&d2);
            if(d1==0||d2==0)continue;
            addedge(d1,d2);
        }
        int ans=MaxMatch();
        printf("%d\n",ans);
    }
    return 0;
}

  邻接矩阵存储

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define nMAX 105
using namespace std;
int map[nMAX][nMAX],link[nMAX];
bool vs[nMAX];
int n,m;
bool dfs(int x)
{
    int i;
    for(i=0;i<m;i++)
    {
        if(!vs[i]&&map[x][i])
        {
            vs[i]=1;
            if(!link[i]||dfs(link[i]))
            {
                link[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int MaxMatch()
{
    int ans=0,i;
    memset(link,0,sizeof(link));
    for(i=0;i<n;i++)
    {
        memset(vs,0,sizeof(vs));
        if(dfs(i))ans++;
    }
    return ans;
}
int main()
{
    int i,j,k,SUM,cnt;
    while(~scanf("%d",&n)&&n)
    {
        scanf("%d%d",&m,&cnt);
        memset(map,0,sizeof(map));
        SUM=cnt;
        while(cnt--)
        {
            scanf("%d%d%d",&k,&i,&j);
            if(i==0||j==0)continue;
            map[i][j]=1;
        }
        int ans=MaxMatch();
        printf("%d\n",ans);
    }
    return 0;
}

  

posted @ 2012-02-21 01:45  快乐.  阅读(223)  评论(0)    收藏  举报