自即日起 每天 好好做2 3题....
今天 想开个好头的 然后 悲剧的TLE。。。
先上题
嗯.... 无言 分析 在我的代码 注释中给出了
我写了 2种 分别是 二维数组 与 vector
一开始 以为二维数组超时 然后 vector可以过
事实 无情地告诉我 太天真了。。。
现在 仍旧 TLE中 应该可以在 明天 解决吧 先纪念下我的TLE代码
1 // 二分图 --- 最大独立集 2 // 先使用了 mp 二维数组来实现 超时 3 // 然后用了vector存储 还是 tle .......... 4 5 #include <iostream> 6 #include <cstring> 7 #include <vector> 8 using namespace std; 9 10 const int size = 520; 11 struct data 12 { 13 int height; 14 char gendle; 15 char music[110]; 16 char sport[110]; 17 }couple[size]; 18 bool vis[size]; 19 int linker[size]; 20 // bool mp[size][size]; 21 vector<int>ve[size]; 22 int n; 23 24 bool judge( data p , data q ) // 判断能否连接起来 将不满足老师4个条件的2个学生连接起来 25 { 26 if( ( (p.height-q.height<=-40) || (p.height-q.height>=40) ) || p.gendle==q.gendle || strcmp( p.music,q.music) || !strcmp(p.sport,q.sport) ) 27 return false; // false 不连接 28 return true; 29 } 30 31 bool dfs( int v ) 32 { 33 for( int u = 0 ; u<ve[v].size() ; u++ ) 34 { 35 if( !vis[ ve[v][u] ] ) 36 { 37 vis[ ve[v][u] ] = true; 38 if( linker[ ve[v][u] ]==-1 || dfs( linker[ ve[v][u] ] ) ) 39 { 40 linker[ ve[v][u] ] = v; 41 return true; 42 } 43 } 44 } 45 return false; 46 } 47 48 int maxMatch() 49 { 50 int cnt = 0; 51 memset( linker , -1 , sizeof(linker) ); 52 for( int u = 0 ; u<n ; u++ ) 53 { 54 memset( vis , false , sizeof(vis) ); 55 if( ve[u].size()!=0 && dfs(u) ) 56 cnt++; 57 } 58 return cnt; 59 } 60 61 int main() 62 { 63 int t , i , j; 64 scanf( "%d",&t ); 65 while( t-- ) 66 { 67 scanf( "%d",&n ); 68 for( i = 0 ; i<size ; i++ ) 69 ve[i].clear(); 70 //memset( mp , false , sizeof(mp) ); 71 for( i = 0 ; i<n ; i++ ) 72 { 73 scanf( "%d %c %s %s",&couple[i].height,&couple[i].gendle,couple[i].music,couple[i].sport ); 74 } 75 for( i = 0 ; i<n ; i++ ) 76 { 77 for( j = i+1 ; j<n ; j++ ) 78 { 79 if( judge(couple[i],couple[j]) ) 80 { 81 ve[i].push_back(j); 82 } 83 } 84 } 85 printf( "%d\n", n-maxMatch() ); 86 } 87 return 0; 88 }
嗯 1点钟已经到了 在TZ还是 TLE 肯定是写法太挫了 然后我去POJ 交了 先WA 然后我换了种方法 1000+ms ac 怪不得在TZ 是 TLE
但是i 还没搞懂 为什么 WA呢
1 // 二分图 --- 最大独立集 2 // 先使用了 mp 二维数组来实现 超时 3 // 然后用了vector存储 还是 tle .......... 4 5 #include <iostream> 6 #include <cstring> 7 #include <vector> 8 #include <cstdio> 9 using namespace std; 10 11 const int size = 520; 12 struct data 13 { 14 int height; 15 char gendle; 16 char music[110]; 17 char sport[110]; 18 }couple[size]; 19 bool vis[size]; 20 int linker[size]; 21 // bool mp[size][size]; 22 vector<int>ve[size]; 23 int n; 24 25 bool judge( data p , data q ) // 判断能否连接起来 将不满足老师4个条件的即会发生恋爱关系的学生 连接起来 26 { 27 if( ( (p.height-q.height<-40) || (p.height-q.height>40) ) || p.gendle==q.gendle || strcmp( p.music,q.music)!=0 || !strcmp(p.sport,q.sport) ) 28 return false; // false 不连接 29 return true; 30 } 31 32 bool dfs( int v ) 33 { 34 for( int u = 0 ; u<ve[v].size() ; u++ ) 35 { 36 if( !vis[ ve[v][u] ] ) 37 { 38 vis[ ve[v][u] ] = true; 39 if( linker[ ve[v][u] ]==-1 || dfs( linker[ ve[v][u] ] ) ) 40 { 41 linker[ ve[v][u] ] = v; 42 return true; 43 } 44 } 45 } 46 return false; 47 } 48 49 int maxMatch() 50 { 51 int cnt = 0; 52 memset( linker , -1 , sizeof(linker) ); 53 for( int u = 0 ; u<n ; u++ ) 54 { 55 memset( vis , false , sizeof(vis) ); 56 if( dfs(u) ) 57 cnt++; 58 } 59 return cnt; 60 } 61 62 int main() 63 { 64 int t , i , j; 65 scanf( "%d",&t ); 66 while( t-- ) 67 { 68 scanf( "%d",&n ); 69 for( i = 0 ; i<size ; i++ ) 70 ve[i].clear(); 71 //memset( mp , false , sizeof(mp) ); 72 for( i = 0 ; i<n ; i++ ) 73 { 74 scanf( "%d %c %s %s",&couple[i].height,&couple[i].gendle,couple[i].music,couple[i].sport ); 75 } 76 /* 77 for( i = 0 ; i<n ; i++ ) 78 { 79 for( j = i+1 ; j<n ; j++ ) 80 { 81 if( judge(couple[i],couple[j]) ) 82 { 83 ve[i].push_back(j); 84 } 85 } 86 } 87 这样就是WA。 我的输出也会变成 n-maxMatch() */ 88 for( i = 0 ; i<n ; i++ ) 89 { 90 for( j = 0 ; j<n ; j++ ) 91 { 92 if( judge( couple[i] , couple[j] ) ) 93 ve[i].push_back(j); 94 } 95 } 96 printf( "%d\n", n-maxMatch()/2 ); 97 } 98 return 0; 99 } 100
明天 应该都会解决.~~ 去撸一把 碎觉 ...
全世界 失眠 多好
TOJ----1037---最大独立集,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/radical/p/3775586.html