不开O2 WA9点 开O2就AC
查看原帖
不开O2 WA9点 开O2就AC
113326
DLSINNOCENCE楼主2022/6/12 21:23

求助 就A了最后一个点

#include <bits/stdc++.h>
using namespace std;
struct Edge{
	int next,to,w;
}edge[10000];
int h[10000];
int cnt;
int ccnt[10000];
int n,m;
void addEdge(int u,int v,int w){
	cnt++;
	edge[cnt].next=h[u];
	edge[cnt].to=v;
	edge[cnt].w=w;
	h[u]=cnt;
}
int vis[10000],dis[10000];
bool spfa(int u){
	queue<int>q;
	memset(vis,0,sizeof vis);
	vis[u]=1;
	for(int i=1;i<=n;i++) dis[i]=1e9;
	dis[u]=0;
	q.push(u);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=h[u];i;i=edge[i].next){
			int v=edge[i].to;
			if(dis[v]>dis[u]+edge[i].w){
				dis[v]=dis[u]+edge[i].w;
				if(!vis[v]){
					vis[v]=1,ccnt[v]++;
					if(ccnt[v]>n+1) return 0;
					q.push(v);
				}
			}
		}
	}
	return 1;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		addEdge(0,i,0);
	}
	for(int i=1;i<=m;i++){
		int x,y,k;
		scanf("%d%d%d",&x,&y,&k);
		addEdge(y,x,k);
	}
	
	if(!spfa(0)) puts("NO");
	else {
		for(int i=1;i<=n;i++) cout<<dis[i]<<' ';
	} 
	
} 
2022/6/12 21:23
加载中...