此题80 or 90 pts 求问哪里错了or hack
查看原帖
此题80 or 90 pts 求问哪里错了or hack
335477
ker_xyxyxyx_xxs楼主2021/7/22 16:44

RT

# include <iostream>
# include <cstdio>
# include <queue>
# include <cstring>
# include <vector>
# define int long long
using namespace std;
const int maxn = 1000 + 5;
const int maxm = 1e6 + 5;
const int inf = 0x3f3f3f3f3f3f3f3f3f;

int n , m;
int S , T;
int x , y , z;
int a[maxn];
typedef struct {
	int x , y , z , next;
} Edge ;
Edge edge[maxm];
int E = 0 , elast[maxn];
int dis[maxn];
bool vis[maxn];
vector<int> g[maxn];
int cnt[maxn];
void add(int x , int y , int z) {
	E ++;
	edge[E].x = x;
	edge[E].y = y;
	edge[E].z = z;
	edge[E].next = elast[x];
	elast[x] = E;
}
struct Node {
	int k;
	int dis;
	Node (int k_ , int dis_) {
		k = k_;
		dis = dis_;
	}
};
bool operator < (Node a , Node b) {
	return a.dis > b.dis;
}
int dfs(int u , int flow) {
	int temp , delta;
	delta = 0;
	if (u == T) return flow;
	for (int i = elast[u] ; i ; i = edge[i].next) {
		int v = edge[i].y;
		if (edge[i].z > 0 && dis[u] == dis[v] + 1) {
			temp = dfs(v , min(flow - delta , edge[i].z));
			edge[i].z -= temp;
			edge[i ^ 1].z += temp;
			delta += temp;
			if (delta == flow || dis[1] >= T) return delta;
		}
	}
	if (dis[1] >= T) return delta;
	cnt[dis[u]] --;
	if (cnt[dis[u]] == 0) dis[1] = T;
	dis[u] ++;
	cnt[dis[u]] ++;
	return delta;
}
int Isap() {
	int Ans = 0;
	while (dis[1] < T) {
		Ans += dfs(1 , inf + 1);
	}
	return Ans;
}
priority_queue<Node> q;
signed main() {
	scanf("%lld%lld" , &n , &m);
	for (int i = 1 ; i <= m ; i ++) {
		scanf("%lld%lld%lld" , &x , &y , &z);
		add(x , y , z);
		add(y , x , z);
	}
	for (int i = 1 ; i <= n ; i ++) {
		scanf("%lld" , &a[i]);
	}
	for (int i = 1 ; i <= n ; i ++) {
		g[i].clear();
	}
	a[1] = inf;
	a[n] = inf;
	S = 1;
	T = n << 1;
	memset(dis , inf , sizeof dis);
	memset(vis , false , sizeof vis);
	q.push(Node(1 , 0));
	dis[1] = 0;
	while (!q.empty()) {
		int x = q.top().k;
		q.pop();
		if (vis[x]) continue;
		vis[x] = true;
		for (int i = elast[x] ; i ; i = edge[i].next) {
			int y = edge[i].y;
			if (dis[y] > dis[x] + edge[i].z) {
				dis[y] = dis[x] + edge[i].z;
				q.push(Node(y , dis[y]));
			}
		}
	}
	for (int i = 1 ; i <= n ; i ++) {
		for (int j = elast[i] ; j ; j = edge[j].next) {
			int y = edge[j].y;
			int x = i;
			if (dis[y] == dis[x] + edge[j].z) {
				g[x].push_back(y);
			}
		}
	}
	memset(elast , 0 , sizeof elast);
	memset(dis , 0 , sizeof dis);
	E = 0;
	for (int i = 1 ; i <= n ; i ++) {
		add((i - 1) << 1 | 1 , i << 1 , a[i]);
		add(i << 1 , (i - 1) << 1 | 1 , 0);
	}
	for (int i = 1 ; i <= n ; i ++) {
		for (int j = 0 ; j < g[i].size() ; j ++) {
			int End = g[i][j];
			add(i << 1 , (End - 1) << 1 | 1 , inf);
			add((End - 1) << 1 | 1 , i << 1 , 0);
		}
	}
	printf("%lld\n" , Isap());
	return 0;
}

2021/7/22 16:44
加载中...