首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 系统运维 >

[2分匹配邻接表法]poj 3894:System Engineer

2012-12-21 
[二分匹配邻接表法]poj 3894:System Engineer大致题意:? ? 就是裸的二分图最大匹配,但是数据量达到10000,

[二分匹配邻接表法]poj 3894:System Engineer

大致题意:
? ? 就是裸的二分图最大匹配,但是数据量达到10000,所以邻接表不再适用,要使用邻接矩阵存储。

?

大致思路:

? ? 没想到照着邻接矩阵的改改就行了。

?

#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int nMax=20005;class edge{public:    int v,nex;};edge e[200005];int n,m,k,head[nMax];int link[nMax];bool vis[nMax];void addedge(int b,int a){//向图中加边的算法,注意加上的是有向边//b为a的后续节点既是a---->b    e[k].v=a;    e[k].nex=head[b];    head[b]=k;k++;}bool dfs(int u){    for(int i = head[u]; i != 0; i = e[i].nex){        int v = e[i].v;        if(!vis[v]){            vis[v] = true;            if(link[v] == -1 || dfs(link[v])){                link[v] = u;                return true;            }        }    }    return false;}int main(){    int ans=0,i,j,a,b,c;    while(scanf("%d",&n)!=EOF){        k=1;        memset(head,0,sizeof(head));        for(i=0;i<n;i++){            scanf("%d: (%d)",&a, &b);            a++;            while(b--){                scanf("%d",&c);                c-=(n-1);                addedge(a,c);            }        }        ans=0;        memset(link,-1,sizeof(link));        for(i = 1; i <= n; i ++){            memset(vis,0,sizeof(vis));            if(dfs(i)) ans++;        }        printf("%d\n", ans);    }    return 0;}
?

?

热点排行