68pts
查看原帖
68pts
681809
BMWIsland楼主2024/5/23 21:46

68,不知道为什么卡死了 MLE3 TLE1

#include<bits/stdc++.h>
#define FAST() ios::sync_with_stdio(0),cin.tie(nullptr)
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define _rep(a,b,c) for(int a=b;a>=c;a--)
#define __rep(a,b) for(auto a:b)
#define yEs cout<<"Yes"<<endl;
#define NO cout<<"No"<<endl;
#define pii pair<int,int>
#define psi pair<string,int>
#define Ss stringstream
#define pci pair<char,int>
#define mii map<int,int>
#define pq prioriry_queue
#define msi map<string,int>
#define mci map<char,int>
#define debug(x) cout<<#x<<":"<<(x)<<" "
#define mem(x,y) memset(x,y,sizeof x)
#define fir first
#define se second
#define endl '\n'
#define int long long
#define INT_MAX LONG_LONG_MAX
using namespace std;
static const int N=6e2+114;
const int inf = 1e9;

inline int read() {
	int w=1,c,ret;
	while((c=getchar())>'9'||c< '0')w=(c=='-'?-1:1);
	ret=c-'0';
	while((c=getchar())>='0'&&c<='9')ret=ret*10+c-'0';
	return ret*w;
}
const int mod = 1000000007;
const int lenm=3;


int n,m;
const int graphmx=6e3+114;

const int dense=2;
struct John {
	struct edg {
		int next,to;
		int w;
	} edge[graphmx*dense];
	int head[graphmx];
	int cnt=0;
	int h[graphmx];
	bool f[graphmx];
	int vis[graphmx];
	void add_edge(int u, int v, int w) {
		edge[++cnt].to=v;
		edge[cnt].next=head[u],edge[cnt].w=w;
		head[u]=cnt;
	}
	vector<int> dij(int s) {
		priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int, int>>>pq;
		vector<int>dis(graphmx,inf);
		dis[s]=0;
		pq.push({0, s});
		while (!pq.empty()) {
			auto[d,u]=pq.top();
			pq.pop();
			if (d>dis[u])continue;
			for (int i=head[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;
					pq.emplace(dis[v],v);
				}
			}
		}

		return dis;
	}
	bool spfa(int s) {
		queue<int>q;
		for(int i=1; i<=n; ++i) h[i]=inf,f[i]=false;
		h[s]=0;
		f[s]=true;
		q.push(s);
		while(!q.empty()) {
			int xx=q.front();
			q.pop();
			f[xx]=false;
			for(int i=head[xx]; i; i=edge[i].next)
				if(h[edge[i].to]>h[xx]+edge[i].w) {
					h[edge[i].to]=h[xx]+edge[i].w;
					if(!f[edge[i].to]) {
						if(++vis[edge[i].to]>=n+1)return false;
						f[edge[i].to]=true,q.push(edge[i].to);
					}
				}
		}
		return true;
	}

	pair<bool,vector<vector<int>>> johnson() {
		vector<vector<int>>diss;
		if(!spfa(0)) {
			return {1,diss};
		}
		rep(u,1,n)
		for(int i=head[i]; i; i=edge[i].next)
			edge[i].w+=h[u]-h[edge[i].to];
		rep(i,0,n) {
			vector<int> ANs=dij(i);
			diss.emplace_back(ANs);
		}
		return {0,diss};
	}

} John;
struct graph {
	struct edg {
		int next,to;
		int w;
	} edge[graphmx*dense];
	bool Primvis[graphmx];
	int head[graphmx];
	int cnt=0;
	graph() {
		memset(Primvis,0,sizeof Primvis);
		memset(head,0,sizeof head);
		Primvis[1]=1;

	}
	void add_edge(int u,int v,int w) {
		edge[++cnt].to=v;
		edge[cnt].next=head[u],edge[cnt].w=w;
		head[u]=cnt;
	}
	vector<int>dij(int s) {
		priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int, int>>>pq;
		vector<int>dis(graphmx,inf);
		dis[s]=0;
		pq.push({0, s});
		while (!pq.empty()) {
			auto[d,u]=pq.top();
			pq.pop();
			if (d>dis[u])continue;
			for (int i=head[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;
					pq.emplace(dis[v],v);
				}
			}
		}
		return dis;
	}
	pair<vector<int>,bool>spfa(int s) {
		vector<int>dis(graphmx,inf);
		vector<int>cnt(graphmx,0);
		vector<bool>inqueue(graphmx,false);
		queue<int> q;
		dis[s] = 0;
		q.push(s);
		inqueue[s] = true;
		cnt[s]++;
		bool has_negative_cycle = false;

		while (!q.empty() && !has_negative_cycle) {
			int u = q.front();
			q.pop();
			inqueue[u] = false;

			for (int i = head[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 (!inqueue[v]) {
						q.push(v);
						inqueue[v] = true;
						cnt[v]++;
						if (cnt[v] >= graphmx) {
							has_negative_cycle = true;
							break;
						}
					}
				}
			}
		}
		return {dis, has_negative_cycle};
	}
	pair<bool,vector<vector<int>>>Johnson() {
		memcpy(&(John.cnt),&(this->cnt),sizeof John.cnt);
		memcpy(&(John.edge),&(this->edge),sizeof John.edge);
		memcpy(&(John.head),&(this->head),sizeof John.head);
		vector<pair<int,vector<pair<int, int>>>> diss;
		for(int i=1; i<=n; i++)John.add_edge(0,i,0);
		return John.johnson();
	}

};
graph f;
void Solve() {
	cin>>n>>m;
	rep(i,1,m) {
		int u,v,w;
		cin>>u>>v>>w;
		f.add_edge(u,v,w);
	}
	pair<bool,vector<vector<int>>>a;
	a=f.Johnson();
	if(a.first) {
		cout<<"-1"<<endl;
		return;
	}
	auto b=a.second;
	rep(i,1,n) {
		int ans=0;
		for(int j=1; j<=n; j++)
			if(b[i][j]==inf) ans+=1ll*(j)*inf;
			else ans+=1ll*(j)*(b[i][j]);
		cout<<ans<<endl;

	}
}


signed main() {
	FAST();
	int T;
	T=1;
//	cin>>T;
	while(T--)Solve();
}
2024/5/23 21:46
加载中...