图的遍历 PAT 甲级

1.1013 Battle Over Cities (25 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805500414115840
输出cout会超时

#include<bits/stdc++.h>
using namespace std;
int n,m,k,de;
vector <int> G[1010];
bool visit[1010];
void init(){
	for(int i=0;i<=n;i++){
		visit[i]=false;
	}
}
void dfs(int p){
    if(p==de){
       return ;
    }
	visit[p]=true;
	for(unsigned int i=0;i<G[p].size();i++){
		if(!visit[G[p][i]]){
			dfs(G[p][i]);
		}
	}
	return ;
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	int l,r;
	for(int i=0;i<m;i++){
		scanf("%d%d",&l,&r);
		G[l].push_back(r);
		G[r].push_back(l); 
	}
	for(int query=0;query<k;query++){
		scanf("%d",&de);
		init();
		int cnt=0;
		for(int i=1;i<=n;i++){
			if(i==de)
			    continue;
			if(!visit[i]){
				dfs(i);
				cnt++;
			}
		}
		printf("%d\n",cnt-1);
	}
	return 0;
}

2.1021 Deepest Root (25 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856

#include<bits/stdc++.h>
using namespace std;
int n;
vector <int> G[10010];
set <int> a,b;
int level[10010];
int visit[10010];
int father[10010];
void init(){
	for(int i=1;i<=n;i++){
		father[i]=i;
	}
}
bool IsOne(int a, int b){
	int fa=a,fb=b;
	while(father[fa]!=fa){
		fa=father[fa];
	}
	while(father[fb]!=fb){
		fb=father[fb];
	}
	int ca=a;
	while(father[a]!=fa){
		ca=father[a];
		father[a]=fa;
		a=ca;
	}
	int cb=b;
	while(father[b]!=fb){
		cb=father[b];
		father[b]=fb;
		b=cb;
	}
	if(fa==fb)
	return true;
	else return false;
}
void Union(int a, int b){
	if(!IsOne(a,b)){
		int f=father[a];
		father[f]=b;
	}
}

bool IsTree(){
	 int k=0;
	 for(int i=1;i<=n;i++){
	 	if(father[i]==i)
		     k++;
	 }
	 if(k==1){
	 	return true;
	 } 
	 else {
	 	printf("Error: %d components",k);
	 	return false;
	 }
	
}
void bfs(int p,set <int> &pSet){
	for(int i=1;i<=n;i++){
		level[i]=0;
		visit[i]=0;
	}
	queue <int> q;
	q.push(p);
	visit[p]=1;
	int L=0;
	int f=0;
	while(!q.empty()){
		f=q.front();
		q.pop();
		int cnt=0;
		for(unsigned int i=0;i<G[f].size();i++){
			if(visit[G[f][i]]==0){
				level[G[f][i]]=level[f]+1;
				visit[G[f][i]]=1;
				q.push(G[f][i]);
				cnt++;
			}
		}
		if(cnt==0){
			if(level[f]>L){
				L=level[f];
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(level[i]==L){
			pSet.insert(i);
		}
		
	}
}
int main(){
	scanf("%d",&n);
	int l,r;
	init(); 
	for(int i=1;i<n;i++) {
		scanf("%d%d",&l,&r);
		G[l].push_back(r);
		G[r].push_back(l);
		Union(l,r);
	}
	if(IsTree()){
	
	bfs(1,a);
	set <int>::iterator t1,t2;
	t1=a.begin();
	bfs(*t1,a);
	for(t1=a.begin();t1!=a.end();t1++){
		cout<<*t1<<endl;
	}
	}
	return 0;
}

3.1034 Head of a Gang (30 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624

#include<bits/stdc++.h>
using namespace std;
int n,k;
map <string,int> person;
map <int,string> toName;
int w[2020];
int G[2020][2020];
bool edge[2020][2020];
bool visit[2020];
vector <int> result;
vector<int> P;
int Pre=1;
void dfs(int p,vector<int> &Point,int &sum){
	Point.push_back(p);
	visit[p]=true;
	for(int i=1;i<Pre;i++){
		if(i==p)continue;
		if(G[p][i]!=0&&edge[p][i]==false){
		    edge[p][i]=true;
			edge[i][p]=true;
			sum+=G[p][i];
			if(visit[i]==false)
			{
				dfs(i,Point,sum);
			}
		}
	}			
}
int main(){
	scanf("%d%d",&n,&k);
	char n1[1000],n2[1000];
	int time;
	map <string,int>::iterator it;
	for(int i=1;i<2020;i++){
		for(int j=1;j<2020;j++){
			edge[i][j]=false;
			G[i][j]=0;
		}
	}
	for(int i=0;i<n;i++){
		scanf("%s %s %d",n1,n2,&time);
		string name1(n1),name2(n2);
		if(person.find(name1)==person.end()){
			person.insert(make_pair(name1,Pre));
			toName.insert(make_pair(Pre,name1));
			Pre++;
		}
		if(person.find(name2)==person.end()){
			person.insert(make_pair(name2,Pre));
			toName.insert(make_pair(Pre,name2));
			Pre++;
		}
		w[person[name1]]+=time;
		w[person[name2]]+=time;
		G[person[name1]][person[name2]]+=time;
		G[person[name2]][person[name1]]+=time;
	}//共有[1,Pre-1]的人 
	for(int i=1;i<Pre;i++){
		visit[Pre]=false;
	}	
	int cnt=0,sum=0;
	for(int i=1;i<Pre;i++){
		if(!visit[i]){
			P.clear();
			sum=0;
			dfs(i,P,sum);
			if(P.size()>2&&sum>k){
				int MaxNum=0,Max=0;
				for(vector<int>::iterator it=P.begin();it!=P.end();it++){
					if(w[*it]>Max){
						MaxNum=*it;
						Max=w[*it];
					}
				}
				result.push_back(MaxNum);
				result.push_back(P.size());
				cnt++;
			}
		}
	}
	cout<<cnt<<endl;
	map<string,int> out;
	for(vector<int>::iterator it=result.begin();it!=result.end();it+=2){
		out.insert(make_pair(toName[*it],*(it+1)));
	} 
	for(map<string,int>::iterator it=out.begin();it!=out.end();it++){
		cout<<it->first<<" "<<it->second<<endl;
	} 

	return 0;
}

4.1076 Forwards on Weibo (30 分)
https://pintia.cn/problem-sets/994805342720868352/problems/994805392092020736

#include<bits/stdc++.h>
using namespace std;
int N,L;
vector<int> G[1010];
bool visit[1010];
int level[1010];
void init(){
	for(int i=1;i<=N;i++){
		visit[i]=false;
		level[i]=0;
	}
}
int bfs(int qry){
	int re=0;
	init();
	queue <int> q;
	q.push(qry);
	visit[qry]=true;
	int f;
	while(!q.empty()){
		f=q.front();
		q.pop();
		if(level[f]==L)
		   break;
		for( vector<int>::iterator it=G[f].begin();it!=G[f].end();it++ ){
			if(visit[*it]==false){
				visit[*it]=true;
				level[*it]=level[f]+1;
				q.push(*it);
			    re++;   
			}
		}	
	}
	return re;
}
int main(){
	cin>>N>>L;
	for(int i=1;i<=N;i++){
		int n;
		cin>>n;
		int temp;
		for(int j=0;j<n;j++){
			cin>>temp;
			G[temp].push_back(i);
		}
	}
	int times;
	cin>>times;
	for(int query=0;query<times;query++){
		int qry;
		cin>>qry;
		cout<<bfs(qry)<<endl;
	} 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值