无重复的点
#include<bits/stdc++.h>
#define maxn 505
using namespace std;
int info[maxn],Prev[20005],to[20005],cst[20005],cnt_e;
inline void Node(int u,int v,int ct){ Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v,cst[cnt_e]=ct; }
int dis[maxn];
vector<int>G[maxn],P[maxn];
struct node
{
map<int,bool>st;
queue<int>sk;
int Dis,loc;
node(){Dis = loc = 0;for(;!sk.empty();sk.pop());st.clear();}
bool operator < (const node&B)const
{
return Dis + dis[loc] > B.Dis + dis[B.loc];
}
}tmp,nxt;
int n,m,s,t;
priority_queue<node>q;
bool vis[maxn];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,u,v,w;i<=m;i++) scanf("%d%d%d",&u,&v,&w),Node(u,v,w),G[v].push_back(u),P[v].push_back(w);
scanf("%d%d",&s,&t);
memset(dis,0x3f,sizeof dis);
dis[t] = 0;
for(int i=1;i<=n;i++)
{
int Minloc = -1;
for(int j=1;j<=n;j++)
if(!vis[j] && (Minloc == -1 || dis[Minloc] > dis[j]))
Minloc = j;
vis[Minloc] = 1;
for(int j=0,siz=G[Minloc].size();j<siz;j++)
if(dis[G[Minloc][j]] > dis[Minloc] + P[Minloc][j])
dis[G[Minloc][j]] = dis[Minloc] + P[Minloc][j];
}
tmp.st[s] = 1,tmp.sk.push(s),tmp.Dis=0,tmp.loc=s;
q.push(tmp);
int K = 3;
for(;!q.empty() && K;)
{
tmp = q.top() , q.pop();
if(tmp.loc == t)
{
K--;
printf("%d:",tmp.Dis);
for(;!tmp.sk.empty();tmp.sk.pop()) printf(" %d",tmp.sk.front());
puts("");
}
for(int i=info[tmp.loc];i;i=Prev[i])
if(!tmp.st[to[i]])
{
nxt=tmp;
nxt.loc = to[i] , nxt.Dis = tmp.Dis + cst[i],
nxt.st[to[i]] = 1, nxt.sk.push(to[i]);
q.push(nxt);
}
}
if(K) puts("no road");
}
或者可持久化左偏树