本文主要是介绍校赛 SDUT OJ2860生日Party(BFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目地址:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2860
唉。。校赛的时候把这题用搜索的时间复杂度2^15次方想成了15^15次方。。。。所以没写。。。后来用的最短路的floyd算法改成了最长路做的,但有一些细节不好处理,调了会没调出来。。赛后才想到用暴搜不会超时。。于是补完线代后怒敲暴搜代码,敲了10分钟然后1Y。。。sad。。。。遗憾。。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <algorithm>using namespace std;
int mp[20][20], b[20], max1, n;
struct node
{int a[15], top, ans, x;
};
void bfs()
{int i, j, x;queue<node>q;node f1, f2;f1.top=0;f1.x=-1;f1.ans=0;q.push(f1);while(!q.empty()){f1=q.front();q.pop();//printf("%d\n",f1.ans);if(f1.x==n-1){if(max1<f1.ans)max1=f1.ans;continue ;}for(i=0;i<f1.top;i++){f2.a[i]=f1.a[i];}f2.ans=f1.ans;f2.top=f1.top;f2.x=f1.x+1;q.push(f2);f2.top=f1.top+1;f2.a[f1.top]=f2.x;f2.ans=f1.ans+b[f2.x];for(i=0;i<f1.top;i++){f2.ans=f2.ans+mp[f2.a[i]][f2.x];}q.push(f2);}
}
int main()
{int t, i, j;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&b[i]);}for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&mp[i][j]);}}max1=-1;bfs();if(max1<0)printf("0\n");elseprintf("%d\n",max1);}return 0;
}
这篇关于校赛 SDUT OJ2860生日Party(BFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!