求助
查看原帖
求助
184055
Beyond616楼主2020/10/5 17:37
#pragma optmize(2)
#include<cstdio>
#include<stack>
#define ll long long
#define N 119
#define INF (ll)1e18
using namespace std;
struct Edge
{
	ll to,head,val;
}edge[2*N*N];
ll cnt[N],tot,ans=INF,s,t,stk[N],len,c[N],cant[N][N],n,k,m,u,v,d,count;
void add(ll uk,ll vk,ll wk)
{
	edge[++tot].to=vk;
	edge[tot].head=cnt[uk];edge[tot].val=wk;
	cnt[uk]=tot;
	
}
int ok(ll u)
{
	++count;
	for (ll i=1;i<=len;++i)
	if (cant[c[u]][c[stk[i]]]||u==stk[i]) return false;
	return true;
}
void dfs(ll u1,ll nans)
{
	++count;
//	printf("dfs(%lld,%lld)\n",u1,nans);
	if (nans>=ans) return;
	if (!ok(u1)) return;
	stk[++len]=u1;
	if (u1==t) 
	{
		ans=nans;
		--len;
		return;
	}
	for (ll i=cnt[u1];i;i=edge[i].head)
	dfs(edge[i].to,nans+edge[i].val);
	--len;
}
int main()
{
	freopen("P1078_10.in","r",stdin);
	scanf("%lld%lld%lld%lld%lld",&n,&k,&m,&s,&t);
	for (ll i=1;i<=n;++i) scanf("%lld",&c[i]);
	for (ll i=1;i<=k;++i)
	for (ll j=1;j<=k;++j) scanf("%lld",&cant[i][j]);
	for (ll i=1;i<=m;++i)
	{
		scanf("%lld%lld%lld",&u,&v,&d);
		add(u,v,d); add(v,u,d);
	} dfs(s,0);
	printf("%lld",count);
//	if (ans==INF) printf("-1");
//	else printf("%lld",ans);
//	for (ll i=cnt[1];i;i=edge[i].head) printf(":%lld ",edge[i].to);
	return 0;
}

求助,这题无论咋想都是O(n3)O(n^3),为啥会T

2020/10/5 17:37
加载中...