A. Attack 2019南昌邀请赛

https://nanti.jisuanke.com/t/40253

索然无味,一堆题目全是抄袭hdu4085 2011北京区域赛的原题

#include<bits/stdc++.h>
using namespace std;

const int maxl=31;

int n,m,up,inf,ans;
int a[maxl];
int f[1<<8][maxl],g[1<<8];
struct ed{int to,l;};
vector<ed> e[maxl];
bool in[maxl];
map<string,int> mp;
string s,t;
queue<int> q;

inline void prework()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>s;
		mp[s]=i;
	}
	int u,v,l;
	for(int i=1;i<=m;i++)
	{
		cin>>s>>t>>l;
		u=mp[s];v=mp[t];
		e[u].push_back(ed{v,l});
		e[v].push_back(ed{u,l});
	}
	up=1<<8;
	for(int i=1;i<=4;i++)
	{
		cin>>s>>t;
		u=mp[s];v=mp[t];
		a[i]=u;a[i+4]=v;
	}
}

inline void spfa(int f[])
{
	int u,v;
	while(!q.empty())
	{
		u=q.front();q.pop();
		for(ed ee:e[u])
		{
			v=ee.to;
			if(f[v]<=f[u]+ee.l)
				continue;
			f[v]=f[u]+ee.l;
			if(!in[v])
				in[v]=true,q.push(v);
		}
		in[u]=false;
	}
}

inline bool ck(int s) {return (s&((1<<4)-1))==(s>>4);}

inline void mainwork()
{
	memset(f,0x3,sizeof(f));
	memset(g,0x3f,sizeof(g));
	for(int i=1;i<=8;i++)
		f[1<<(i-1)][a[i]]=0;
	inf=f[0][0];
	for(int s=1;s<up;s++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int t=s&(s-1);t;t=(t-1)&s)
				f[s][i]=min(f[s][i],f[s^t][i]+f[t][i]);
			if(f[s][i]<inf)
				q.push(i),in[i]=true;
		}
		spfa(f[s]);
		for(int i=1;i<=n;i++)
			g[s]=min(g[s],f[s][i]);
	}
	for(int s=1;s<up;s++)
		for(int t=s&(s-1);t;t=(t-1)&s)
		if(ck(t) && ck(s^t))
			g[s]=min(g[s],g[t]+g[s^t]);
	
	ans=g[up-1];
}

inline void print()
{
	printf("%d\n",ans);
}

int main()
{
	prework();
	mainwork();
	print();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/107566842