海洋之心


私信TA

用户名:wanggongsheng

访问量:132631

签 名:

等  级
排  名 18
经  验 21670
参赛次数 3
文章发表 163
年  龄 26
在职情况 学生
学  校
专  业 计算机技术

  自我简介:

读研ing,平时不登录dotcpp

分析题目要求:

  1. 首相明确有两种目的地,一种是回到原点,一种是到达一个没有到过的地方;

  2. 路径中经过的点不能够有重复的点;

  3. 根据题目给出的数据可以发现,1-2-3-4  和 4-3-2-1是两条不同的路径。

解体思路:

 1.使用vis[]数组记录经过的点;

 2.使用DFS寻找可能的路径,因为路径的长度是4,那么当寻找路径上的前3个点的时候,如果可以从前一个点走到当前的点,并且当前的点没有走过,那么将当前的点设置为路径当中的点。

 3.寻找路径第四个点的时候,有两种可能的情况,一种是可以到达的第四个点是之前没有走过的点,方案数量加一,另外一的情况是可以到达的第四个点是第一个点(走回到了起点),方案数量加一。

    
注意事项:
 1.使用vector创建一个邻接表,如果使用邻接矩阵,容易时间超限。


参考代码:

#include<iostream>
#include<vector> 
#include<cstring>
#include<algorithm>
using namespace std;
int M,N,u,v,ans;
const int maxn=10010;
vector<int>G[maxn];
bool used[maxn];

//u表示上一个顶点,dep表示当前寻找第dep+1个结点,s表示起点; 
void DFS(int u,int dep,int s){
	if(dep==3){ 
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i];
			if(!used[v] || v==s) ans++; 
		}
		return ;
	}
	else{
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i];
			if(!used[v]){
				used[v]=true;
				DFS(v,dep+1,s);
				used[v]=false;
			}
		}
	}
	return ;
}

int main(void){
	cin>>N>>M;
	for(int i=1;i<=M;i++){
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	
	memset(used,0,sizeof(used));
	for(int i=1;i<=N;i++){
		used[i]=true; 
		DFS(i,1,i);
		used[i]=false; 
	}
	cout<<ans;
	return 0;
}
 

0.0分

14 人评分

  评论区

可以把四个节点当成城市,城市1,城市2,城市3,城市4。
四条边当成城市之间路,一共有四条路。
城市1和城市2,城市2和城市3,城市3和城市1,城市1和城市4各有一条通路。
问:从一个城市,经过两个不同的城市,到达一个城市的路径方案数量?
2020-04-13 01:50:21
  • «
  • 1
  • »