求助
查看原帖
求助
638717
Lyu_echo楼主2022/11/11 16:02

rt

样例1都还没过

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
	int distance,subscript;
	friend bool operator < (node a,node b){
		return a.distance > b.distance;
	}
};
struct EDGE{
	int v,w,nxt;
}edge[6010];
priority_queue<node>pq;
queue<int>q;
int n,m,edge_cnt;
int head[6010];
int dis[3010],stic[3010],times[3010];
bool book[3010];
void add(int u,int v,int w){
	edge[++edge_cnt].v=v;
	edge[edge_cnt].w=w;
	edge[edge_cnt].nxt=head[u];
	head[u]=edge_cnt;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	for(int i=1;i<=n;i++) add(0,i,0);

	memset(stic,0x7f,sizeof stic);
	stic[0]=0;
	book[0]=1;
	q.push(0);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		book[u]=0;
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].v;
			int w=edge[i].w;
			if(stic[v]>stic[u]+w){
				stic[v]=stic[u]+w;
				if(!book[v]){
					q.push(v);
					book[v]=1;
					times[v]++;
					if(times[v]==n+1){
						cout<<-1;
						return 0;
					}
				}
			}
		}
	}
	for(int u=1;u<=n;u++){
		for(int i=head[u];i;i=edge[i].nxt){
			edge[i].w+=(stic[u]-stic[edge[i].v]);
		}
	}
	for(int j=1;j<=n;j++){
		for(int i=1;i<=n;i++){
			dis[i]=1e9;
			book[i]=0;
		}
		while(!pq.empty()) pq.pop();
		book[j]=1;
		dis[j]=0;
		pq.push((node){0,j});
		while(!pq.empty()){
			int u=pq.top().subscript;
			pq.pop();
			if(book[u]) continue;
			book[u]=1;
			for(int i=head[u];i;i=edge[i].nxt){
				int v=edge[i].v;
				int w=edge[i].w;
				if(dis[v]>dis[u]+w){
					dis[v]=dis[u]+w;
					pq.push((node){v,dis[v]});
				}
			}
		}
		ll sum=0;
		for(int i=1;i<=n;i++) sum+=i*dis[i];
		cout<<sum<<endl;
	}

	return 0;
}
2022/11/11 16:02
加载中...