题目大意:给定n个点的坐标,m个的点之间关系,即游客从i到j之间的流量。问从最西边到最东边能够运输的客人流量的最大值(/每小时)。
思路:直接见图找到源汇点跑最大流。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
struct nod{
int x,y;
}qq[100100];
struct node{
int to,next;
int w;
}q[100100*4];
int head[100100],cnt;
bool vis[100100];
int st,ed;
void add(int a,int b,int c){
q[cnt].to = b;
q[cnt].w = c;
q[cnt].next=head[a];
head[a] = cnt++;
q[cnt].to = a;
q[cnt].w = c;
q[cnt].next=head[b];
head[b] = cnt++;
}
int l[100100];
bool bfs(){
memset(l,-1,sizeof(l) );
l[st]=0;
queue<int>Q;
Q.push(st);
while(!Q.empty()){
int u=Q.front();
Q.pop();
for(int i = head[u]; ~i ;i=q[i].next){
int v=q[i].to;
if(q[i].w > 0&&l[v]==-1){
l[v] = l[u] + 1;
Q.push(v);
}
}
}
return l[ed]!=-1;
}
int dfs(int x,int f){
if(x == ed || !f){
return f;
}
int a,tmp=0;
for(int i=head[x] ;~i; i=q[i].next){
int v = q[i].to;
if(q[i].w > 0 && l[x]+1==l[v]){
a = dfs(v,min(q[i].w,f-tmp));
if(a > 0){
q[i].w -= a;
q[i^1].w += a;
tmp += a;
if(tmp ==f )
break;
}
}
}
if(!tmp)
l[x] =-1;
return tmp;
}
int main(){
int n,m,i,j,k,cla;
scanf("%d",&cla);
while(cla--){
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
memset(vis,false,sizeof(vis));
int l=inf,r=-inf;
cnt=0;
for(i = 1;i <= n;++ i ){
scanf("%d%d",&qq[i].x,&qq[i].y);
if(l > qq[i].x){
st = i;
l = qq[i].x;
}
else if( l == qq[i].x){
if(qq[l].y > qq[i].y){
l=i;
}
}
if(r < qq[i].x ){
ed = i;
r = qq[i].x;
}
else if(r == qq[i].x){
if(qq[r].y < qq[i].y)
ed = i;
}
}
//cout<<st<<" "<<ed<<endl;
int a,b,c;
for(i = 0;i < m;++ i){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
int ans=0;
while(bfs()){
ans+= dfs(st,inf);
}
printf("%d\n",ans);
}
return 0;
}