题目
某人不仅把图一的点打乱,还修改了一些路径。这个新图成为图2.
现在求图1和图2的最大相似度。
(ps:相似度的定义为将城市还原后还有多少条道路和之前的道路相同)
Input
第一行为两个整数n,m,表示一共有n个城市,m条道路
接下来m行,每行两个整数x,y,表示原来小G的世界地图中有一条道路连接编号为x和y的两个城市。
紧接着m行,每行两个整数x’,y’,表示被大G修改后的世界地图中有一条道路连接编号为x’和y’的两个城市。
Output
一行一个整数,表示最大相似度。
【数据规模和约定】
对于30%的数据,1 ≤ n ≤ 3,1 ≤ m≤ 20。
对于60%的数据,1 ≤ n ≤ 7,1 ≤ m≤ 70。
对于100%的数据,1 ≤ n ≤ 9,1 ≤ m≤ 300。
思路
由于这个n挺小的,所以可以放心暴力。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
bool b[11];
int n,m,ans,aa[11][11],bb[11][11],anss[11];
void dd(){ //统计相似度
int l=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
l+=min(aa[i][j],bb[anss[i]][anss[j]]);
//因为路径有重复的,比如1-1和1-1会输入n次。。。
ans=max(ans,l);
return;
}
void dfs(int d) //深搜
{
if(d>n) dd();
else
for(int i=1;i<=n;++i) //枚举图1的d点和i点匹配。
if(b[i]==false){
anss[d]=i; //记录
b[i]=true;
dfs(d+1);
b[i]=false;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int x,y;
scanf("%d%d",&x,&y);
++aa[x][y]; //因为路径有重复的,比如1-1和1-1会输入n次。。。
}
for(int i=1;i<=m;++i){
int x,y;
scanf("%d%d",&x,&y);
++bb[x][y]; //因为路径有重复的,比如1-1和1-1会输入n次。。。
}
memset(b,0,sizeof(b)); //初始化
dfs(1);
printf("%d",ans);
}