图论弱连通分量求救
  • 板块学术版
  • 楼主ChairmanJ
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/12/7 20:39
  • 上次更新2023/11/3 22:42:55
查看原帖
图论弱连通分量求救
383049
ChairmanJ楼主2021/12/7 20:39

题目: 老字号的店名都是从右往左念的,但随着时代的发展你想让你的店名被世界各地更多的人接受,所以你决定调整店名使得它从左往右念、从右往左念都是一样的。店名被简化表示为一个仅包含小写字母的字符串s,每次你能从当前字符串中选择一种字母,并将它们同时修改为另一类字母。问最少需要多少次修改达到目的(每修改1个字符记作1次)。

输入格式

输入仅一行,一个字符串s,表示你的老字号店名

输出格式

输出仅一行,表示最少修改次数,如果无法达到目的, 输出-1 。

输入样例

tongrentang

输出样例

5

#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
int t,f[1000],fa[1000],cnt,ans,pat[1000];
stack<int>q;
string s;
int find(int n,int l){
	if(fa[n]==n){
	//	cout<<n<<endl;
		if(l==0){
			q.push(s[n]);
		}
		return n;
	}
	else{
		if(l==0){
			q.push(s[n]);
		}
		return fa[n]=find(fa[n],l);
	}
}
int main(){
	cin>>s;
	int p=s.length();
	for(int i=0;i<s.length();i++){
		f[s[i]-'0']++;
		if(s[i]-'0'>t){
			//cout<<s[i]<<endl;
			t=s[i];
		}
	}
//	cout<<t<<endl;
//	cout<<t+'0'<<endl;
	for(int i=1;i<=t;i++){
		fa[i]=i;
	}
    for(int i=0;i<p;i++){
    	
    	int fx=find(s[i],1);
    	int fy=find(s[p-1-i],1);
    	if(s[i]!=s[p-1-i]){
    	     fa[fx]=fy;
		}
}
	int i=0;
	int maxn=-1;
	while(cnt!=p){
		find(s[i],0);
		while(!q.empty()){
			int top=q.top();
			q.pop();
		//	cout<<top<<endl;
			if(f[top]>maxn){
				maxn=f[top];
			}
			if(pat[top]==0){
			cnt++;
			pat[top]=1;
		}
	}
//	cout<<"---"<<endl;
		ans=ans+maxn;
		i++;
	}
	cout<<ans;
	return 0;
}

能改就提些意见吧,菜鸡刚学图论Tarjan都运用的不熟练

2021/12/7 20:39
加载中...