前面都是对的,就是输出的时候for有问题。。。我只好写print用递归才ac(我是以n为起点的)
#include<bits/stdc++.h>
const int INF=0x3f3f3f3f;
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int maxn=3005;
const int maxm=2e4+5;
int ne[maxm<<1],to[maxm<<1],head[maxn],ct;
void add(int x,int y){
ne[++ct]=head[x];
to[ct]=y;
head[x]=ct;
}
#define pii pair<int,int>
set <pii> lim[maxn];
int dis[maxn][maxn];
pii pre[maxn][maxn];
bool vis[maxn][maxn];
struct node{
int p;
int u;
int d;
bool operator<(const node x)const
{
return x.d<d;
}
};
void di(int s){
memset(dis,0x3f,sizeof(dis));
priority_queue<node> q;
dis[0][s]=0;
vis[0][s]=1;
q.push({0,s,0});
while(!q.empty()){
auto tmp=q.top();
int x=tmp.p;int y=tmp.u;
q.pop();
vis[x][y]=1;
for(int i=head[y];i;i=ne[i]){
if(vis[y][to[i]])continue;
if(!lim[x].count(make_pair(y,to[i]))){
if(dis[y][to[i]]>dis[x][y]+1){
dis[y][to[i]]=dis[x][y]+1;
pre[y][to[i]]=make_pair(x,y);
q.push({y,to[i],dis[y][to[i]]});
}
}
}
}
}
int read(){
int x=0;char c;
while(!isdigit(c))c=getchar();
while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
void print (int p,int now){
if(!now) return ;
printf("%d ",now);
print(pre[p][now].first,pre[p][now].second);
}
int main(){
int k,n,m,u,v,w;
n=read();
m=read();
k=read();
rep(i,1,m){
u=read(),v=read();
add(u,v);add(v,u);
}
rep(i,1,k){
u=read(),v=read(),w=read();
lim[w].insert(make_pair(v,u));
}
di(n);
int ans=INF;
int point;
rep(i,1,n){
if(ans>dis[i][1]){
ans=dis[i][1];
point=i;
}
}
printf("%d\n",ans);
// for(int i=1,j=point;j>0;j=pre[j][i].first,i=pre[j][i].second){
// cout<<pre[j][i].first<<pre[j][i].second<<i<<j;
// }
print(point,1);
}