求助
查看原帖
求助
1015002
Charles_with_wkc楼主2024/10/20 12:22

8pts 万花从中一株草

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int N=10005;
struct Edge{
	int v,w,nxt;
}edge[N];
struct node{
	int u,d;
	bool operator<(const node& a)const{
		return d>a.d;
	}
};
int head[N],sp_dis[N],ans[N],dis[N];
bool vis[N];
int n,m,f,t,k,cnt;
void add(int u,int v,int w){
	edge[++cnt]=Edge{v,w,head[u]};
	head[u]=cnt;
	return ;
}
void spfa(int st){
	queue<int>q;
	fill(sp_dis,sp_dis+1+N,1e9);
	sp_dis[st]=0;
	vis[st]=1;
	q.push(st);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u];i;i=edge[i].nxt){
			if(sp_dis[edge[i].v]>sp_dis[u]+edge[i].w){
				sp_dis[edge[i].v]=sp_dis[u]+edge[i].w;
				if(!vis[edge[i].v]){
					vis[edge[i].v]=1;
					q.push(edge[i].v);
					ans[edge[i].v]++;
					if(ans[edge[i].v]==n+1){
						cout<<-1;
						exit(0);
					}
				}
			}
		}
	}
	return ;
}
void dijkstra(int st){
	priority_queue<node>q;
	fill(dis,dis+1+N,1e9);
	memset(vis,0,sizeof(vis));
	dis[st]=0;
	q.push(node{st,0});
	while(!q.empty()){
		int u=q.top().u;
		q.pop();
		if(vis[u]){
			continue;
		}
		vis[u]=1;
		for(int i=head[u];i;i=edge[i].nxt)
			if(dis[edge[i].v]>dis[u]+edge[i].w){
				dis[edge[i].v]=dis[u]+edge[i].w;
				if(!vis[edge[i].v]){
					vis[edge[i].v]=1;
					q.push(node{edge[i].v,dis[edge[i].v]});
				}
			}
	}
	return ;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>f>>t>>k;
		add(f,t,k);
	}
	for(int i=1;i<=n;i++) add(0,i,0);
	spfa(0);
	for(int u=1;u<=n;u++)
		for(int i=head[u];i;i=edge[i].nxt){
			edge[i].w+=sp_dis[u]-sp_dis[edge[i].v];
		}
	for(int i=1;i<=n;i++){
		dijkstra(i);
		int sum=0;
		for(int j=1;j<=n;j++)
			if(dis[j]==1e9) sum+=j*1e9;
			else sum+=j*(dis[j]+sp_dis[j]-sp_dis[i]);
		cout<<sum<<endl;
	}
	return 0;
}
2024/10/20 12:22
加载中...