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;
}

浙公网安备 33010602011771号