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;
}