您的位置:首页 > 理论基础 > 计算机网络

2012天津赛区网络赛 hdu 4280 Island Transport

2012-09-11 20:58 316 查看
这题比赛时套各种模板都TLE到吐了。。。赛后发现自己2B了,按照以前的模板的写法,每次都是由u->v, v->u各构成一条边,这里的话本来是无向图每次构建从u->v的就行了,汗。。。。不过效率还是很低啊,模板还不够强大,因为也有人构双边sap水过的。。。

当然赛后别人说是平面图构图最短路

http://www.mzry1992.com/blog/miao/9.html

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#include <limits.h>
#define MAX 100015
using namespace std;
int n,np,nc,m;
int lev[MAX];
typedef struct NODE{
int from,to;
int cap;
int next;
}NODE;

struct cor
{
int x,y,idx;
}cord[MAX];
bool cmp(const cor&a,const cor&b)
{
return a.x<b.x;
}
NODE node[MAX<<2];
int cou,net[MAX];
int a[MAX];
int pos[MAX],pre[MAX];
void init()
{
cou = 2;
memset(node,'/0',sizeof(node));
memset(net,-1,sizeof(net));
}
queue<int> q;
int BFS(int s,int t)
{
int u,v,head,cap;
memset(lev,-1,sizeof(lev));
q.push(s);
lev[s] = 0;
while( !q.empty() )
{
u = q.front();
q.pop();
head = net[u];
while( head != -1 )
{
v = node[head].to;
cap = node[head].cap;
if( cap > 0 && lev[v] == -1 )
{
lev[v] = lev[u] + 1;
q.push(v);
}
head = node[head].next;
}
}
return lev[t] != -1;
}

int Dinic(int s,int t)
{

int flow = 0;
int head,cap;
int i,u,flag,v,ag,k;
while( BFS(s,t) )
{
for(i=0; i<=t; i++)
a[i] = INT_MAX;
u = s;
while(1)
{
flag = 0;
head = net[u];
while( head != -1 )
{
cap = node[head].cap;
v = node[head].to;
if( cap > 0 && lev[u] + 1 == lev[v] )
{
pos[v] = head;
flag = 1;
break;
}
head = node[head].next;
}
if( flag )
{
pre[v] = u;
a[v] = cap;
if( a[v] > a[u] )
a[v] = a[u];
u = v;
if( u == t )
{
ag = a[t];
flow += ag;
for(v=t; v!=s; v=pre[v])
{
node[pos[v]^1].cap += ag;
node[pos[v]].cap -= ag;
a[v] -= ag;
if( node[pos[v]].cap == 0 )
u = pre[v];
}
}
}
else
if( u != s )
{
lev[u] = INT_MAX;
u = pre[u];
}
else
break;
}
}
return flow;
}
void Add(int u,int v,int len)
{
node[cou].from = u;
node[cou].to = v;
node[cou].cap = len;
node[cou].next = net[u];
net[u] = cou++;

/*node[cou].from = v;                  把这里注释掉就水过了,比赛时各种TLE
node[cou].to = u;
node[cou].cap = 0;
node[cou].next = net[v];
net[v] = cou++;*/
}

int main()
{
int T;
scanf("%d",&T);
while(T--)
{

init();
int n,m;
scanf("%d%d",&n,&m);
int _min=1000001,_max=-1000001;
int min_id,max_id;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&cord[i].x,&cord[i].y);
cord[i].idx=i;
if(cord[i].x<_min) {_min=cord[i].x; min_id=i;}
if(cord[i].x>_max) {_max=cord[i].x; max_id=i;}
}

for(int i=1;i<=m;i++)
{
int s,t,c;
scanf("%d%d%d",&s,&t,&c);
Add(s,t,c);
Add(t,s,c);
}
Add(0,min_id,INT_MAX);
Add(max_id,n+1,INT_MAX);
int ans=Dinic(0,n+1);
cout<<ans<<endl;

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: