Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
不知为何,dinic算法,邻接表建双向边会超,单向边94ms#include<cstring> #include<cstdio> #include<queue> #include<algorithm> #define INF 0x7fffffff using namespace std; int n, np, nc, m; int map[1005][1005]; int fir[20005],nex[20005],cnt; int u[20005],v[20005]; int lev[1005]; void add(int a, int b){ u[cnt] = a, v[cnt] = b; nex[cnt] = fir[a]; fir[a] = cnt++; } bool Bfs(int s, int t){ memset(lev, -1, sizeof(lev)); queue<int>q; q.push(s); lev[s] = 0; while( !q.empty() ){ int a = q.front(); q.pop(); for(int k = fir[a]; k != -1; k = nex[k]){ int b = v[k]; if(map[a][b] && lev[b] == -1){ lev[b] = lev[a] + 1; q.push(b); } } } return lev[t]>0; } int Dfs(int s, int t, int low){ if(s==t) return low; int a=0; for(int k = fir[s]; k != -1; k = nex[k]){ int b = v[k]; if( map[s][b] && lev[s]+1 == lev[b] && ( a = Dfs(b, t, min(low,map[s][b]) ) )){ map[s][b] -= a; map[b][s] += a; return a; } } lev[s] = -1; return 0; } void Dinic(int s, int t){ int ans=0, a; while( Bfs(s, t) ){ while( a = Dfs(s, t, INF) ) ans+=a; } printf("%d\n",ans); } int main(){ int a,b,c; while( scanf("%d%d%d%d", &n, &np, &nc, &m) != EOF){ cnt = 0; memset(map, 0,sizeof(map)); memset(fir, -1, sizeof(fir)); for(int i = 0; i < m; ++i){ scanf(" (%d,%d)%d", &a, &b, &c); map[a+1][b+1] = c; add(a+1, b+1); //add(b+1, a+1);双向边就会超时 } for(int i = 0; i < np; ++i){ scanf(" (%d)%d", &b, &c); map[0][b+1] = c; add(0, b+1); //add(b+1, 0); } for(int i = 0;i < nc; ++i){ scanf(" (%d)%d", &b, &c); map[b+1][n+1] = c; add(b+1, n+1); //add(n+1, b+1); } Dinic(0,n+1); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator