这题真是被弄的欲仙欲死啊,开始写的代码死活的a不掉,也不知道哪里错了,先附上,求大牛指点啊.....
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; int n,m; int point[100+5]; int re; int ree[105]; int l; struct stu { int a,b; }; stu mapp[100000+5]; void dfs(int x,int sum,int y[],int k)//搜索 { y[k]=mapp[x].a; k++; if(mapp[x].b==n+1) { y[k]=1; if(sum>re) { re=sum; l=k; for(int i=0;i<=k;i++) { ree[i]=y[i]; } } return; } sum+=point[mapp[x].b]; for(int i=x+1;i<m;i++) { if(mapp[x].b==mapp[i].a&&mapp[i].a<mapp[i].b) dfs(i,sum,y,k); } } bool cmp(stu x,stu y) { return x.a <y.a; } int main() { cin.sync_with_stdio(false); int t; cin>>t; int s; for(s=1;s<=t;s++) { cin>>n; for(int i=1;i<=n;i++) cin>>point[i];//输入 cin>>m; for(int i=0;i<m;i++) cin>>mapp[i].a>>mapp[i].b;//输入 re=-1; if(s!=1) cout<<endl; sort(mapp,mapp+m,cmp);//排序 for(int i=0;i<m;i++) { int mem[205]; if(mapp[i].a==1&&mapp[i].a<mapp[i].b)//搜索 dfs(i,0,mem,0); } cout<<"CASE "<<s<<"#"<<endl; cout<<"points :"<<" "<<re<<endl; printf("circuit : %d",ree[0]); for(int i=1;i<=l;i++) printf("->%d",ree[i]); cout<<endl; } return 0; }
之后用动态数组重写,回溯记录路径才过了,被弄的不要不要的> . <!
下面是ac代码
#include<iostream> #include<vector> #include<cstring> #define maxn 105 using namespace std; vector<int>mapp[maxn]; int point[maxn]; int visit[maxn]; int ans[maxn]; int rem[maxn]; int n,m; int re; void dfs(int d,int sum) { if(d==n+1) { if(re<sum) { re=sum; for(int i=0;i<maxn;i++) ans[i]=rem[i]; } } for(int i=0;i<mapp[d].size();i++) { int next=mapp[d][i]; if(!visit[next]) { visit[next]=1; rem[next]=d; dfs(next,sum+point[next]); visit[next]=0; } } } void print(int x) { if(x==1) cout<<1; else { print(ans[x]); if(x==n+1) x=1; cout<<"->"<<x; } } int main() { int s,t; cin>>t; for(s=1;s<=t;s++) { for(int i=0;i<maxn;i++) mapp[i].clear(); cin>>n; for(int i=1;i<=n;i++) cin>>point[i]; point[n+1]=0; cin>>m; for(int i=0;i<m;i++) { int x,y; cin>>x>>y; mapp[x].push_back(y); } visit[1]=1; re=-1; memset(visit,0,sizeof(visit)); dfs(1,0); cout<<"CASE "<<s<<"#"<<endl; cout<<"points : "<<re<<endl; cout<<"circuit : "; print(n+1); cout<<endl; if(s!=t) cout<<endl; } return 0; }
时间: 2024-10-29 05:05:38