#10 TLE (本人觉得是题解做法)
查看原帖
#10 TLE (本人觉得是题解做法)
1036707
chzhh_111楼主2024/7/15 18:35
#include<bits/stdc++.h>
using namespace std;
const int N=101;
int n,k,m,s,t,c[N],ls1,ls2,z1[N],z2[N],ans=1e9,q[N*N],dis[N];bool p[N];
struct bian{
	int qi/*起点*/,zhong/*终点*/,quan/*权值*/,zhi/*指针*/;
}s1[2*N*N],s2[N];
void spfa()
{
	memset(dis,0x3f,sizeof(dis));
	int l=0,r=1;
	q[1]=t;p[t]=1;dis[t]=0;
	while(l<r)
	{
		l++;
		p[q[l]]=0;
		for(int i=z1[q[l]];i;i=s1[i].zhi)
		{
			if(dis[s1[i].zhong]>dis[s1[i].qi]+s1[i].quan)
			{
				dis[s1[i].zhong]=dis[s1[i].qi]+s1[i].quan;
				if(!p[s1[i].zhong])
				{
					p[s1[i].zhong]=1;
					q[++r]=s1[i].zhong;
				}
			}
		}
	}
}
bool check(int x)
{
	for(int i=z2[x];i;i=s2[i].zhi)
		if(p[s2[i].zhong]) return 0;
	return 1;
}
void dfs(int x,int sum)
{
	if(sum+dis[x]>=ans) return;//用当前已走的路径长度,加上从这个点走到终点的不考虑文化排斥的最短距离,一个剪枝
	if(x==t) {ans=sum;return;}
	for(int i=z1[x];i;i=s1[i].zhi)
	{
		if(!p[c[s1[i].zhong]]&&check(c[s1[i].zhong]))
		{
			p[c[s1[i].zhong]]=1;
			dfs(s1[i].zhong,sum+s1[i].quan);
			p[c[s1[i].zhong]]=0;
		}
	}
}
int main()
{
	scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
	for(int i=1;i<=n;i++) scanf("%d",&c[i]);
	for(int i=1;i<=k;i++)
	{
		int z;
		for(int j=1;j<=k;j++)
		{
			scanf("%d",&z);
			if(z) s2[++ls2]=(bian){i,j,0,z2[i]},z2[i]=ls2;
		}
	}
	for(int i=1;i<=m;i++)
	{
		int a,b,cc;
		scanf("%d%d%d",&a,&b,&cc);
		s1[++ls1]=(bian){a,b,cc,z1[a]},z1[a]=ls1;
		s1[++ls1]=(bian){b,a,cc,z1[b]},z1[b]=ls1;
	}
	spfa();//用spfa先提前预处理一下不考虑文化排斥的最短路径
	if(dis[s]==1061109567) {printf("-1");return 0;} 
	p[c[s]]=1;
	dfs(s,0);
	if(ans<1e9) printf("%d",ans);
	  else printf("-1");
	return 0;
}

觉得变量名逆天,可以说。

2024/7/15 18:35
加载中...