字符串问题
首先第一个要解决的是题意理解的问题,即什么时候会不合法
仔细观察会发现,当字符串的价值大于0且出现重复字母时是没有最大值的,这很像最短路,仔细看看发现是的,然后就是打代码了
昨晚又没睡好,结果手写站队列炸了
——————————————————————————————————————
这题数据小,
而
因
为
每
个
点
都
要
搜
,
又
不
能
用
d
i
j
s
t
r
a
,
s
p
f
a
有
可
能
退
化
到
O
(
n
3
)
,
所
以
用
弗
洛
伊
德
算
法
会
比
较
好
,
由
于
忘
了
有
这
种
算
法
,
所
以
我
直
接
上
了
s
p
f
a
而因为每个点都要搜,又不能用dijstra,spfa有可能退化到O(n^3),所以用弗洛伊德算法会比较好,由于忘了有这种算法,所以我直接上了spfa
而因为每个点都要搜,又不能用dijstra,spfa有可能退化到O(n3),所以用弗洛伊德算法会比较好,由于忘了有这种算法,所以我直接上了spfa
————————————————————————————————————
STL写法(手写队列没改出来)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=110;
const ll INF=12345678900000;
int n,cnt=0;
ll ans=-INF;
struct edge{
int v,link;
ll w;
}q[N*N];
int head[N];
ll dis[N],sum[N];
void put(int u,int v,ll w){q[++cnt].v=v;q[cnt].link=head[u];head[u]=cnt;q[cnt].w=w;}
bool flag=false,ex[N];
int check;
void spfa(int s){
queue <ll> myline;
while(!myline.empty()) myline.pop();
memset(sum,0,sizeof(sum));//每次spfa前一定要赋初始值 !!!
memset(ex,0,sizeof(ex));
memset(dis,-0x7f,sizeof(dis));
ex[s]=1;dis[s]=0;sum[s]++;
myline.push(s);
while(!myline.empty()){
int u=myline.front();myline.pop();ex[u]=0;
for(int i=head[u];i;i=q[i].link){
int v=q[i].v;
if(dis[v]<dis[u]+q[i].w){
dis[v]=dis[u]+q[i].w;
ans=max(ans,dis[v]);
if(!ex[v]){
ex[v]=1;
myline.push(v);
sum[v]++;
if(sum[v]>=n){
flag=true;
return;
}
}
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
ans=-INF;//
memset(head,0,sizeof(head)),cnt=0;//
scanf("%d",&n);
for(int i=1;i<=n;i++) q[i].link=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
ll val;
scanf("%lld",&val);
if(i!=j)put(i,j,val);
}
check=(T==0);
flag=false;
for(int i=1;i<=n;i++){
if(flag) break;
spfa(i);
}
if(flag) puts("-1");
if(!flag) printf("%lld\n",ans);
}
}