记录编号 141605 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]大楼 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 12.311 s
提交时间 2014-12-03 15:58:39 内存使用 16.89 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int SIZEN=101;
typedef long long LL;
int N;
LL M;
class MATRIX{
public:
	int n,m;
	LL s[SIZEN][SIZEN];
	void print(void){cout<<"size: "<<n<<" "<<m<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<s[i][j]<<" ";}cout<<endl;}cout<<endl;}
	void clear(int n_,int m_){n=n_,m=m_,memset(s,0,sizeof(s));}
	LL mxlen(void){
		LL ans=0;
		for(int i=1;i<=N;i++) ans=max(ans,s[1][i]);
		return ans;
	}
};
MATRIX operator * (MATRIX a,MATRIX b){
	MATRIX c;
	c.n=a.n,c.m=b.m;
	for(int i=1;i<=c.n;i++){
		for(int j=1;j<=c.m;j++){
			c.s[i][j]=0;
			for(int k=1;k<=a.m;k++){
				if(a.s[i][k]&&b.s[k][j])//0代表无边,不是长度为0的边
					c.s[i][j]=max(c.s[i][j],a.s[i][k]+b.s[k][j]);
			}
		}
	}
	return c;
}
MATRIX D,now,tmp;
MATRIX P[210]={0};
void work(void){
	P[0]=D;
	int t;
	for(t=0;P[t].mxlen()<M;t++) P[t+1]=P[t]*P[t];
	if(t<=1){
		printf("%lld\n",1LL<<t);
		return;
	}
	now=P[t-1];//现在已确定2^(t-1)不行,2^t一定行
	LL ans=1LL<<(t-1);
	for(int i=t-2;i>=0;i--){
		tmp=now*P[i];
		if(tmp.mxlen()<M){
			now=tmp;
			ans+=(1LL<<i);
		}
	}
	ans++;
	printf("%lld\n",ans);
}
void read(void){
	scanf("%d",&N);
	scanf("%lld",&M);
	D.clear(N,N);
	for(int i=1;i<=N;i++){
		for(int j=1;j<=N;j++) scanf("%lld",&D.s[i][j]);
	}
}
int main(){
	freopen("building.in","r",stdin);
	freopen("building.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--){
		read();
		work();
	}
	return 0;
}