ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

强化阶段 Day 22 算法笔记 10.3 图的遍历

2021-12-31 19:59:43  阅读:188  来源: 互联网

标签:10.3 22 int maxv bfs start nowvisit include Day


目录

1.Head of a Gang

2.邻接矩阵版bfs

3.邻接表

4.带层号

5.Forwards on Weibo


1.Head of a Gang

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxn=2005;
int g[maxn][maxn]={0},weight[maxn]={0};
map<string,int> stringtoint;
map<string,int> gang;
map<int,string> inttostring;
bool vis[maxn]={false};
int n,k;

void dfs(int nowvisit,int &head,int &membernum,int &totalweight){
	membernum++;
	vis[nowvisit]=true;
	if(weight[nowvisit]>weight[head]){
		head=nowvisit;
	}
	for(int i=0;i<n;i++){
		if(g[i][nowvisit]>0){
			totalweight+=g[i][nowvisit];
			g[i][nowvisit]=g[nowvisit][i]=0;
			if(vis[i]==false){
				dfs(i,head,membernum,totalweight);
			}
		}
	}
}

void dfstrave(){
	for(int i=0;i<n;i++){
		if(vis[i]==false){
			int head=i,membernum=0,totalweight=0;
			dfs(i,head,membernum,totalweight);
			if(membernum>2&&totalweight>k){
				gang[inttostring[head]]=membernum;
			}
		}
	}
}

int numperson=0;
int change(string a){
	if(stringtoint.find(a)!=stringtoint.end()){
		return stringtoint[a];
	}else{
		stringtoint[a]=numperson;
		inttostring[numperson]=a;
		return numperson++;
	}
}

int main(){
	
	scanf("%d%d",&n,&k);
	string a,b;
	int w;
	for(int i=0;i<n;i++){
		cin>>a>>b>>w;
		int id1=change(a);
		int id2=change(b);
		g[id1][id2]+=w;
		g[id2][id1]+=w;
		weight[id1]+=w;
		weight[id2]+=w;
	}
	
	dfstrave();
	cout<<gang.size()<<endl;
	map<string,int>::iterator it;
	for(it=gang.begin();it!=gang.end();it++){
		cout<<it->first<<" "<<it->second<<endl;
	}
	
	
	return 0;
}

2.邻接矩阵版bfs

void bfs(int u){
	queue<int> q;
	q.push(u);
	inq[u]=true;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int v=0;v<n;v++){
			if(inq[v]==false&&g[u][v]!=inf){
				q.push(v);
				inq[v]=true;
			}
		}
	}
}

void bfstrave(){
	for(int u=0;u<n;u++){
		if(inq[u]==false){
			bfs(u);
		}
	}
}

3.邻接表

const int maxv=100000;
int n,g[maxv][maxv];
bool inq[maxv]={false};

void bfs(int u){
	queue<int> q;
	q.push(u);
	inq[u]=true;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int v=0;v<n;v++){
			if(inq[v]==false&&g[v][u]!=inf){
				q.push(v);
				inq[v]=true;
			}
		}
	}
}

4.带层号

void bfs(int s){
	queue<node> q;
	node start;
	start.layer=0;
	start.value=s;
	q.push(start);
	inq[start.value]=true;
	while(!q.empty()){
		node topnode=q.front();
		q.pop();
		int u=topnode.value;
		for(int i=0;i<adj[u].size();i++){
			node next=adj[u][i];
			next.layer=topnode.layer+1;
			if(inq[next.value]==false){
				q.push(next);
				inq[next.value]=true;
			}
		}
	}
}

5.Forwards on Weibo

#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;

const int maxv=1010;
struct node{
	int id;
	int layer;
};
vector<node> adj[maxv];
bool inq[maxv]={false};

int bfs(int s,int l){
	int forwardnum=0;
	node start;
	start.id=s;
	start.layer=0;
	queue<node> q;
	q.push(start);
	inq[start.id]=true;
	while(!q.empty()){
		node topnode=q.front();
		q.pop();
		int id=topnode.id;
		for(int i=0;i<adj[id].size();i++){
			node now=adj[id][i];
			now.layer=topnode.layer+1;
			if(inq[now.id]==false&&now.layer<=l){
				q.push(now);
				inq[now.id]=true;
				forwardnum++;
			}
		}
	}
	return forwardnum++;
}

int main(){
	
	int n,l;
	scanf("%d%d",&n,&l);
	int follownum,id;
	node user;
	for(int i=1;i<=n;i++){
		user.id=i;
		scanf("%d",&follownum);
		for(int j=0;j<follownum;j++){
			scanf("%d",&id);
			adj[id].push_back(user);
		}
	}
	
	int numquery;
	scanf("%d",&numquery);
	int s;
	for(int i=0;i<numquery;i++){
		memset(inq,false,sizeof(inq));
		scanf("%d",&s);
		int numforward=bfs(s,l);
		printf("%d\n",numforward);
	}
	
	return 0;
}

标签:10.3,22,int,maxv,bfs,start,nowvisit,include,Day
来源: https://blog.csdn.net/aixiaoxiao13/article/details/122260983

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有