玄关求调
查看原帖
玄关求调
1365584
majingxu3楼主2024/11/24 10:53
#include<bits/stdc++.h>
using namespace std;
queue<int>q;
vector<pair<int,int> >edges[1005];
bool vis[1005];
int cnt[1005],dis[1005];
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		edges[v].push_back({u,w});	
	}
	memset(dis,0x7fff,sizeof(dis));
	for(int i=1;i<=n;i++){
		edges[n+1].push_back({i,0});
	}
	dis[n+1]=0;
	cnt[n+1]++;
	q.push(n+1);
	vis[n+1]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(auto y:edges[x]){
			if(dis[y.first]>dis[x]+y.second){
				dis[y.first]=dis[x]+y.second;
				if(!vis[y.first]){
					if(cnt[y.first]>=n){
						cout<<"NO SOLUTION";
						return 0;
					}
					cnt[y.first]++;
					q.push(y.first);
					vis[y.first]=1;
				}
			}	
		}
	}
	int minn=0x7fff;
	for(int i=1;i<=n;i++){
		minn=min(minn,dis[i]);
	} 
	for(int i=1;i<=n;i++)cout<<dis[i]-minn<<'\n';
}
2024/11/24 10:53
加载中...