点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
问题描述
问题思路
之前用过回溯,超时。没想到一个dfs就搞定了?
首先判断是不是满足欧拉路的条件出入度,是否联通图等
最后数据量这么大,ccf堆栈可能改小了,10w的数量级不能用递归玩。
不用看了,递归80分,栈溢出,回溯70分,超时。
AC代码
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
char flag[10001][10001],VISIT=char(1);
vector<int>vroot[10001],ans;
int main(){
int n,m,k,degs=0,u,v,f;//输入n m 临时变量k 奇度点个数degs 临时变量u -> v表示u到v有条路 新路径标记f
stack<pair<int,int> >q;//模拟递归
cin>>n>>m,k=n,memset(flag,0,sizeof(flag)),q.push(pair<int,int>(1,1));//数据预处理 输入 重置图状态 栈状态
for(int i=0,a,b;i<m;++i) cin>>a>>b,vroot[a].push_back(b),vroot[b].push_back(a); //输入数据
for(;k>0&°s<2;sort(vroot[k].begin(),vroot[k].end()),--k) if(vroot[k].size()%2==1)++degs;//判断奇度点个数,排序
if(degs==0||degs==2&&k==0)//符合欧拉路度数判定 且 奇度偶时满足起点奇度
while(!q.empty()){
u = q.top().first,v =q.top().second,f=0;
flag[v][u]=flag[u][v]=VISIT;
for(int i=0,ni=vroot[v].size();i<ni;++i)
if(flag[v][vroot[v][i]]!=VISIT){
q.push(pair<int,int>(v,vroot[v][i])),f=1;
break;
}
if(f==1) continue;//有新路径发现 重新查找路径
q.pop(),ans.push_back(v);//没有路径被发现弹出栈 加入节点v
}
if(ans.size()==m+1) for(k=ans.size()-1;k>-1;--k) cout<<ans[k]<<' ';//判断图连通 及连通时输出结果
else cout<<-1;//图不连通 或 不满足欧拉路判定
cout<<endl;//我是负责帅的 你看看就好
return 0;
}
回溯70分代码
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
short status[10001][10001],n,m;
vector<int>vroot[10001],lst;
void DFS_IR(const int& idx)
{
status[idx][idx]=0;
for(int i=0,ni=vroot[idx].size();i<ni;++i)
if(status[vroot[idx][i]][vroot[idx][i]]==-1) DFS_IR(vroot[idx][i]);
}
bool DFS_BC(const int& idx)
{
for(int i=0,ni=vroot[idx].size();i<ni;++i)
if(status[idx][vroot[idx][i]]==-1){
lst.push_back(vroot[idx][i]),status[idx][vroot[idx][i]] = status[vroot[idx][i]][idx] = 0;
if(DFS_BC(vroot[idx][i]))return true;
lst.pop_back(),status[idx][vroot[idx][i]] = status[vroot[idx][i]][idx] = -1;
}
return lst.size()==m;
}
int main()
{
int ans=0,count=0,node=1;
cin>>n>>m,memset(status,-1,sizeof(status));
for(int i=0,a,b;i<m;++i)cin>>a>>b,vroot[a].push_back(b),vroot[b].push_back(a);
for(int i=n;i>0&&count<3;sort(vroot[i].begin(),vroot[i].end()),--i) if((vroot[i].size()%2)==1)++count,node=i;
if(!(count==2||count==0)){cout<<-1<<endl;return 0;}
DFS_IR(1);
for(int i=n;i>0;--i) if(status[i][i]!=0) {cout<<-1<<endl;return 0;}
if(DFS_BC(node)){
cout<<node;
for(int i=0;i<m;++i) cout<<' '<<lst[i];
cout<<endl;
}
else cout<<-1<<endl;
return 0;
}