求助,建模+dinic tle
查看原帖
求助,建模+dinic tle
280465
GDCassini楼主2024/1/2 17:16

rt,代码如下

#include <bits/stdc++.h>
using namespace std;
const int N = 2e3+5,inf = 0x3f3f3f3f;
int s,t,n,m,h,k,a[N];
struct edge{
	int pre,to,c;
}e[1500005];
int dis[605][605];
int dep[N],cnt = 1,head[N];
void add(int from,int to,int c){
	e[++cnt].pre = head[from],e[cnt].to = to,e[cnt].c = c,head[from] = cnt;
	e[++cnt].pre = head[to],e[cnt].to = from,e[cnt].c = 0,head[to] = cnt;
}
bool bfs(){
	queue<int> q;
	memset(dep,-1,sizeof(dep));
	q.push(s),dep[s] = 0;
	while(!q.empty()){
		int u = q.front();q.pop();
		for(int i = head[u];i;i = e[i].pre){
			int v = e[i].to;
			if(!e[i].c || ~dep[v]) continue;
			dep[v] = dep[u] + 1;
			q.push(v);
		}
	}
	return dep[t] != -1;
}
int dfs(int u,int f){
	if(u == t) return f;
	int used = 0;
	for(int i = head[u];i;i = e[i].pre){
		int v = e[i].to;
		if(dep[v] == dep[u] + 1 && e[i].c){
			int tmp = dfs(v,min(f,e[i].c));
			used += tmp,f -= tmp;
			e[i].c -= tmp,e[i^1].c += tmp;
		}
	}
	if(!used) dep[u] = -1;
	return used;
}
void build(int x){
	memset(head,0,sizeof(head));
	cnt = 1;
	for(int i = 1;i <= h;i++){
		for(int j = 1;j <= n;j++){
			if(dis[a[i]][j] <= x) add(i,j+n,1);
		}
	}
	for(int i = 1;i <= h;i++) add(s,i,1);
	for(int i = 1;i <= n;i++) add(i+n,t,1);
}
bool check(int x){
	build(x);
	int res = 0;
	while(bfs()) res += dfs(s,1e9);
	return res >= k;
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	cin >> n >> m >> h >> k;
	s = 2e3+1,t = 2e3+2;
	for(int i = 1;i <= n;i++){
		dis[i][i] = 0;
		for(int j = 1;j < i;j++) 
			dis[i][j] = dis[j][i] = inf;
	}
	for(int i = 1;i <= h;i++) cin >> a[i];
	for(int i = 1;i <= m;i++){
		int u,v,w;
		cin >> u >> v >> w;
		dis[u][v] = dis[v][u] = min(dis[u][v],w);
	}	
	for(int k = 1;k <= n;k++){
		for(int i = 1;i <= n;i++){
			for(int j = 1;j <= n;j++){
				if(dis[i][j] > dis[i][k] + dis[k][j])
					dis[i][j] = dis[i][k]+dis[k][j];
			}
		}
	}
	int l = 0,r = 1731311,mid;
	if(!check(r)){
		cout << -1;
		return 0;
	}
	while(l < r){
		mid = (l+r>>1);
		if(check(mid)) r = mid;
		else l = mid+1;
	}
	cout << l;
	
	return 0;
}
2024/1/2 17:16
加载中...