源码:
#include<iostream>
#include <vector>
using namespace std;
void fun(vector <int> &v,int value)
{
int flag=0;
for (vector<int>::iterator it = v.begin() ; it != v.end(); ++it)
{
if (*it ==value)
{
flag=1;
break;
}
}
if (flag==0)
{
v.push_back(value);
}
}
int find(int **&p,int people ,int value)
{
for (int i=0; i<people; i++)
{
for(int j=0; j<people; j++)
{
if (p[i][j] == value)
{
return i; //在数组中就所在行数
}
}
}
return -1; //不在数组中就返回-1
}
void newgroup(int **arr,int people,int x, int y)
{
for (int i=0; i<people; i++)
{
if (arr[i][0] ==0 )
{
arr[i][0]=x;
arr[i][1]=y;
break;
}
}
}
int f(int people,int *weight,int pai ,int **&paiva)
{
int **arr=new int*[people];
for (int i=0; i<people;i++)
{
arr[i]=new int[people];
} //创建组别的数组
for (int i=0; i<people; i++)
{
for(int j=0; j<people; j++)
{
arr[i][j] = 0;
}
}
for (int i=0; i<pai;i++)
{
for (int j=0; j<2;j++)
{
cout<<paiva[i][j]<<" ";
}
cout<<endl;
}
for (int i=0; i<pai; i++)//根据牌号,分组
{
//1,x,y 都未出现过,把它们在一个新行内分为一组
if( find(arr,people ,paiva[i][0])==-1 && find(arr,people ,paiva[i][1])==-1 )
{
newgroup( arr, people,paiva[i][0] , paiva[i][1]);
continue;
}
if( find(arr,people ,paiva[i][0])!=-1 && find(arr,people ,paiva[i][1])==-1 )
{
int row= find(arr,people ,paiva[i][0]);
for (int k=0; k<people; k++)
{
if (arr[row][k] ==0)
{
arr[row][k]=paiva[i][1];
break;
}
}
continue;
}
if( find(arr,people ,paiva[i][0])==-1 && find(arr,people ,paiva[i][1])!=-1 )
{
int row= find(arr,people ,paiva[i][1]);
for (int k=0; k<people; k++)
{
if (arr[row][k] ==0)
{
arr[row][k]=paiva[i][0];
break;
}
}
continue;
}
if( find(arr,people ,paiva[i][0])!=-1 && find(arr,people ,paiva[i][1])!=-1 ) //都出现过,要看在不在一组
{
cout<<i<<" hang 出现: "<<paiva[i][0]<<paiva[i][1]<<endl;
int row1= find(arr,people ,paiva[i][0]);
int row2= find(arr,people ,paiva[i][1]);
if (row1==row2)
{
break; //同一组无效
}else
{
for (int k=0; k<people; k++)//row2 行复制的 row1 行
{
if (arr[row2][k] !=0)
{
for (int a=0; a<people; a++)
{
if (arr[row1][a] ==0)
{
arr[row1][a]=arr[row2][k];
arr[row2][k]=0;
}
}
}else
break;
}
}
}
}
for (int i=0; i< people; i++)
{
if( find(arr,people , i+1 )==-1 )
{
cout<<"i=1: "<<i+1<<endl;
for (int a=0; a<people; a++)
{
if (arr[a][0] ==0 )
{
arr[a][0]=i+1;
break;
}
}
}
}
for (int i=0; i<people; i++)
{
for(int j=0; j<people; j++)
{
cout<< arr[i][j]<<" ";
}
cout <<endl;
}
for (int a=0; a<people; a++)
{
int sum=0;
for (int b=0; b<people; b++)
{
if (arr[a][b] != 0)
{
sum+=weight[ arr[a][b]-1];
}
}
arr[a][0]=sum;
}
for (int c=0; c<people; c++)
{
cout<< arr[c][0]<<" " <<endl;
}
int max=0;
for (int e=0; e<people; e++)
{
if (arr[e][0]>max)
{
max=arr[e][0];
}
}
return max;
}
int main()
{
//四个样本数据
int people=6;
int weight[]={2,3,5,6,9,10};
int pai=3;
//int paiva[3][2]={{1,2},{2,3},{3,4}};
int **paiva=new int*[3];
for (int i=0; i<3;i++)
{
paiva[i]=new int[2];
}
paiva[0][0]=1;
paiva[0][1]=2;
paiva[1][0]=2;
paiva[1][1]=3;
paiva[2][0]=4;
paiva[2][1]=3;
cout << "最强组实力:"<<f( people, weight, pai ,paiva)<<endl;;
return 0;
}
2,使用容器的版本
#include <iostream> // std::cout
#include <vector> // std::vector
#include <set>
#include <algorithm>
using namespace std;
int finds( vector<set<int> >&vect,int value)
{
for (int i=0; i<vect.size(); i++)
{
if (vect[i].find(value) !=vect[i].end())
{
return i;
}
}
return -1;
}
int f(int people,int *weight,int pai ,int **&paiva)
{
for (int i=0; i<pai;i++)
{
for (int j=0; j<2;j++)
{
cout<<paiva[i][j]<<" ";
}
cout<<endl;
}
int **arr=new int*[people];
vector<set<int> >vect;
set<int> group;
for (int i=0; i<pai; i++)//根据牌号,分组
{
//1,x,y 都未出现过,把它们在一个新行内分为一组
if( finds(vect,paiva[i][0])==-1 && finds(vect ,paiva[i][1])==-1 )
{
set<int> tem;
tem.insert(paiva[i][0]);
tem.insert(paiva[i][1]);
vect.push_back(tem);
continue;
}
if( finds(vect,paiva[i][0]) !=-1 && finds(vect ,paiva[i][1])==-1 )
{
int row= finds(vect,paiva[i][0]);
vect[row].insert(paiva[i][1]);
continue;
}
if( finds(vect,paiva[i][0]) ==-1 && finds(vect ,paiva[i][1]) !=-1 )
{
int row= finds(vect,paiva[i][1]);
vect[row].insert(paiva[i][0]);
continue;
}
if( finds(vect,paiva[i][0]) !=-1 && finds(vect ,paiva[i][1]) !=-1 )
{
int row1= finds(vect,paiva[i][0]);
int row2= finds(vect,paiva[i][1]);
set<int> tem=vect[row1];
set<int> ::iterator it;
for (it=tem.begin(); it !=tem.end(); ++it)
{
vect[row2].insert(*it);
}
vect.erase(vect.begin()+row1) ;
continue;
}
}
for (int i=0; i< people; i++)
{
if( finds(vect,i+1) ==-1 )
{
cout<<"single group: "<<i+1<<endl;
set<int> tem;
tem.insert(i+1);
vect.push_back(tem);
}
}
vector<int> res;
for (int i=0; i<vect.size(); i++)
{
int sum=0;
set<int> tem=vect[i];
set<int> ::iterator it;
for (it=tem.begin(); it !=tem.end(); ++it)
{
cout<< *it<<" ";
sum+=weight[*it-1];
}
res.push_back(sum);
cout <<endl;
}
sort(res.begin(),res.end());
for (int i=0; i<res.size(); i++)
{
cout<<res[i]<<" ";
}
cout<<endl;
return res.back();
}
int main()
{
//四个样本数据
int people=6;
int weight[]={2,3,5,6,9,10};
int pai=3;
//int paiva[3][2]={{1,2},{2,3},{3,4}};
int **paiva=new int*[3];
for (int i=0; i<3;i++)
{
paiva[i]=new int[2];
}
paiva[0][0]=1;
paiva[0][1]=2;
paiva[1][0]=2;
paiva[1][1]=3;
paiva[2][0]=4;
paiva[2][1]=3;
cout << "最强组实力:"<<f( people, weight, pai ,paiva)<<endl;;
return 0;
}