标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 14479 | Accepted: 6172 |
Description
Input
Output
Sample Input
5 5 10 0 1 1 1 1 2 2 1 3 3 1 4 4 2 1 5 2 2 6 2 3 7 2 4 8 3 3 9 4 3 0
Sample Output
3
Source
最小点集覆盖—— 用最少的点,覆盖所有边。
这里面,边指任务,点指机器模式。
这里面的特点是在任务执行顺序没有要求的条件下才可以使用最小点集覆盖。
这里具体还是使用匈牙利算法,找到最大匹配的边数——实际意义为找到匹配边的其中三个对应点,能够覆盖所有的任务。
1 /* 2 Problem: 3 OJ: 4 User: 5 Time: 6 Memory: 7 Length: 8 */ 9 #include<iostream> 10 #include<cstdio> 11 #include<cstring> 12 #include<cmath> 13 #include<algorithm> 14 #include<queue> 15 #include<cstdlib> 16 #include<iomanip> 17 #include<cassert> 18 #include<climits> 19 #include<vector> 20 #include<list> 21 #include<map> 22 #define maxn 101 23 #define F(i,j,k) for(int i=j;i<=k;i++) 24 #define M(a,b) memset(a,b,sizeof(a)) 25 #define FF(i,j,k) for(int i=j;i>=k;i--) 26 #define inf 0x7fffffff 27 #define maxm 2016 28 #define mod 1000000007 29 //#define LOCAL 30 using namespace std; 31 int read(){ 32 int x=0,f=1;char ch=getchar(); 33 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 34 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 35 return x*f; 36 } 37 int n,m,k; 38 int mp[maxn][maxn]; 39 int px[maxn],py[maxn]; 40 int ans; 41 int cx[maxn],cy[maxn]; 42 inline int path(int u) 43 { 44 cx[u]=1; 45 F(i,1,m){ 46 if(mp[u][i]>0&&!cy[i]){ 47 cy[i]=1; 48 if(!py[i]||path(py[i])) 49 { 50 px[u]=i; 51 py[i]=u; 52 return 1; 53 } 54 } 55 } 56 return 0; 57 } 58 inline void solve() 59 { 60 ans=0; 61 M(px,0);M(py,0); 62 F(i,1,n){ 63 if(!px[i]){ 64 M(cx,0);M(cy,0); 65 ans+=path(i); 66 } 67 } 68 return; 69 } 70 int main() 71 { 72 std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y; 73 #ifdef LOCAL 74 freopen("data.in","r",stdin); 75 freopen("data.out","w",stdout); 76 #endif 77 while(cin>>n) 78 { 79 if(n==0) break; 80 cin>>m>>k;M(mp,0); 81 F(i,1,k){ 82 int a,b,c; 83 cin>>a>>b>>c; 84 mp[b][c]=1; 85 } 86 solve(); 87 cout<<ans<<endl; 88 } 89 return 0; 90 }
标签:
原文地址:http://www.cnblogs.com/SBSOI/p/5916340.html