rt,我用 SPFA 得了 80 分,提交记录。
//SPFA
#include<bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
using namespace std;
const int maxn=50050,maxe=100050,maxp=13;
struct Edge{
int v,w,nxt;
Edge() {};
Edge(int _v,int _w,int _nxt) {
v=_v; w=_w; nxt=_nxt;
}
}edge[maxe<<1];
int n,p,m,ecnt,rel[maxp],head[maxn];
queue<int> que;
void init()
{
ecnt=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w)
{
edge[ecnt]=Edge(v,w,head[u]);
head[u]=ecnt++;
}
int dis[maxp][maxn],ans=0x3f3f3f3f;
bool inq[maxn],vis[maxp];
void spfa(int s)
{
dis[s][rel[s]]=0;
que.push(rel[s]);
inq[rel[s]]=true;
while(!que.empty())
{
int u=que.front();
que.pop();
inq[u]=false;
for(int i=head[u];i!=-1;i=edge[i].nxt)
{
int v=edge[i].v,w=edge[i].w;
if(dis[s][v]==-1||dis[s][v]>dis[s][u]+w)
{
dis[s][v]=dis[s][u]+w;
if(!inq[v])
{
inq[v]=true;
que.push(v);
}
}
}
}
}
void dfs(int step,int pos,int sum)
{
if(sum>ans) return;
if(step==p)
{
ans=min(ans,sum);
return;
}
For(i,1,p)
{
if(!vis[i])
{
vis[i]=true;
dfs(step+1,i,sum+dis[pos][rel[i]]);
vis[i]=false;
}
}
}
int main()
{
cin>>n>>m; p=5;
init();
For(i,1,p) cin>>rel[i];
rel[p+1]=1;
while(m--)
{
int u,v,t;
cin>>u>>v>>t;
addedge(u,v,t);
addedge(v,u,t);
}
memset(dis,-1,sizeof(dis));
For(i,1,p+1) spfa(i);
dfs(0,p+1,0);
cout<<ans<<endl;
return 0;
}
但是用 dijkstra 爆零/kk。提交记录。又 WA 又 RE。
//dijkstra
#include<bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
using namespace std;
const int maxn=50050,maxe=100050,maxp=13;
struct Edge{
int v,w,nxt;
Edge() {};
Edge(int _v,int _w,int _nxt) {
v=_v; w=_w; nxt=_nxt;
}
}edge[maxe<<1];
struct Node{
int dis,pos;
bool operator < (const Node &b)const{
return dis>b.dis;
}
Node() {}
Node(int _dis,int _pos) {
dis=_dis; pos=_pos;
}
};
priority_queue<Node> q;
int n,p,m,ecnt,rel[maxp],head[maxn];
void init()
{
ecnt=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w)
{
edge[ecnt]=Edge(v,w,head[u]);
head[u]=ecnt++;
}
int dis[maxp][maxn],ans=0x3f3f3f3f;
bool vis[maxp];
void dijkstra(int s)
{
memset(vis,false,sizeof(vis));
dis[s][rel[s]]=0;
q.push(Node(dis[s][rel[s]],rel[s]));
while(!q.empty())
{
int u=q.top().pos;
q.pop();
if(vis[u]) continue;
vis[u]=true;
for(int i=head[u];i!=-1;i=edge[i].nxt)
{
int v=edge[i].v,w=edge[i].w;
if(dis[s][v]==-1||dis[s][v]>dis[s][u]+w)
{
dis[s][v]=dis[s][u]+w;
q.push(Node(dis[s][v],v));
}
}
}
}
namespace dfs
{
bool vis[maxp];
void dfs(int step,int pos,int sum)
{
if(sum>ans) return;
if(step==p)
{
ans=min(ans,sum);
return;
}
For(i,1,p)
{
if(!vis[i])
{
vis[i]=true;
dfs(step+1,i,sum+dis[pos][rel[i]]);
vis[i]=false;
}
}
}
}
int main()
{
cin>>n>>m; p=5;
init();
For(i,1,p) cin>>rel[i];
rel[p+1]=1;
while(m--)
{
int u,v,t;
cin>>u>>v>>t;
addedge(u,v,t);
addedge(v,u,t);
}
memset(dis,-1,sizeof(dis));
For(i,1,p+1) dijkstra(i);
dfs::dfs(0,p+1,0);
cout<<ans<<endl;
return 0;
}
哪位大佬帮忙查一下错,十分感谢!