请大佬看看最后几行注释的for循环有啥语法问题(
  • 板块P1811 最短路
  • 楼主sonicchen
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/7/25 14:44
  • 上次更新2025/7/25 18:01:39
查看原帖
请大佬看看最后几行注释的for循环有啥语法问题(
1204870
sonicchen楼主2025/7/25 14:44

前面都是对的,就是输出的时候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);
}
2025/7/25 14:44
加载中...