【暴力】【DFS】相似度

题目

某人不仅把图一的点打乱,还修改了一些路径。这个新图成为图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);
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/88369121
今日推荐