唐氏求助样例未过
查看原帖
唐氏求助样例未过
1114241
vectorxyz楼主2024/8/23 11:57

rt,鉴定为 dij 写挂了。。但是找不出问题

#include <bits/stdc++.h>
#define mk(a, b) make_pair(a, b)
#define rep(i, a, b) for(int i = (a);i <= (b);i ++ )
#define DEBUG puts("================================");
#define PII pair<int, int>
#define INF 1000000000
using namespace std;
struct IO{char buf[1<<20],*p1,*p2;
#define gc()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
template<typename T>inline T read(T x){T opt=1,sum=0;char ch=gc();while(!isdigit(ch))opt=(ch=='-')?-1:1,ch=gc();while(isdigit(ch))sum=(sum<<1)+(sum<<3)+(ch^48),ch=gc();return opt*sum;}
inline void put(int x){if(x<0){x=-x;putchar('-');}if(x>9)put(x/10);putchar(x%10+48);}}io;
#define read io.read(0)

const int N = 3e3 + 5;
struct Edge{int u, v, w;};
vector<Edge> g[N];
bool vis[N];
int d[N], dist[N], _[N], n, m;
bool spfa(int s)
{
	memset(vis, 0, sizeof(vis));
	memset(d, 0x3f, sizeof(vis));
	vis[s] = 1;
	queue<int> q;
	q.push(s);
	d[s] = 0;
	while(q.size()){
		int u = q.front();q.pop();
		vis[u] = 0;
		rep(i, 0, g[u].size() - 1){
			int v = g[u][i].v, w = g[u][i].w;
			if(d[v] > d[u] + w){
				d[v] = d[u] + w;
				if(!vis[v]){
					vis[v] = 1;
					q.push(v);
					if(++_[v] == n + 1) return 0;
				}
			}
		}
	}
	return 1;
}

void dijkstra(int s)
{
	priority_queue<PII, vector<PII>, greater<PII> > q;
	memset(dist, 0x3f, sizeof(dist));
	memset(vis, 0, sizeof(vis));
	dist[s] = 0;
	q.push(mk(0, s));
	while(q.size()){
		PII cur = q.top(); q.pop();
		int u = cur.second;
		cout << u << endl;
		if(vis[u]) continue;
		vis[u] = 1;
		rep(i, 0, g[u].size() - 1) {
			int v = g[u][i].v, w = g[u][i].w;
			if(dist[v] > dist[u] + w){
				dist[v] = dist[u] + w;
				q.push(mk(dist[v], v));
			}
		}
	}
}

void work()
{
	cin >> n >> m;
	while(m -- ) {
		int u, v, w; cin >> u >> v >> w; g[u].push_back({v, w});
	}
	rep(i, 1, n) g[0].push_back({i, 0});
	if(!spfa(0)) {
		cout << -1; return;
	}
	
	rep(u, 1, n) {
		rep(i, 0, g[u].size() - 1) {
			int v = g[u][i].v;
			g[u][i].w += d[u] - d[v];
		}
	}
	rep(i, 1, n) {
		dijkstra(i);
		long long ans = 0;
		rep(j, 1, n){
			if(i != j) {
				if(dist[j] == 0x3f3f3f3f) ans += 1ll * j * INF;
				else ans += 1ll * j * (dist[j] + d[j] - d[i]);
			}
		}
		cout << ans << endl;
	}
}

int main(){return work(), 0;} 
2024/8/23 11:57
加载中...