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 |
2144K 500MS 二分图的匹配(付代码),构图还是比较精妙的#include <iostream> #include <cmath> #define MAX_POINT 100 #define MAX_NODE 400 #define DIST(x1, y1, x2, y2) (((x1) - (x2)) * ((x1) - (x2)) + ((y1) - (y2)) * ((y1) - (y2))) using namespace std; static int graph[MAX_NODE + 5][MAX_NODE + 5]; static int gf[MAX_NODE + 5][MAX_NODE + 5]; static int f[MAX_NODE + 5][MAX_NODE + 5]; static int posH[MAX_POINT + 5][2]; static int posI[MAX_POINT + 5][2]; int start = 0, hNum = 0; int end, iNum = 0; int pre[MAX_NODE + 5]; char color[MAX_NODE + 5]; int bfsQ[MAX_NODE + 5]; int qhead, qtail; int cfp; int getShortest() { for(int i = 1; i <= end; i++) { color[i] = 'W'; pre[i] = -1; } qhead = qtail = 1; pre[0] = -1; bfsQ[qtail] = 0; qtail = qtail % (MAX_NODE + 5) + 1; while(qhead != qtail) { int curNode = bfsQ[qhead]; qhead = qhead % (MAX_NODE + 5) + 1; for(int newNode = 0; newNode <= end; newNode++) { if(newNode != curNode && gf[curNode][newNode] >= 1 && color[newNode] == 'W') { color[newNode] = 'G'; pre[newNode] = curNode; bfsQ[qtail] = newNode; qtail = qtail % (MAX_NODE + 5) + 1; } } color[curNode] = 'B'; } if(pre[end] == -1) return -1; cfp = 999999999; int lastV = end; int preV = pre[lastV]; while(preV != 0) { if(gf[preV][lastV] < cfp) cfp = gf[preV][lastV]; lastV = preV; preV = pre[lastV]; } return 0; } void admondsKarp() { while(getShortest() != -1) { int lastV = end; int preV = pre[lastV]; while(preV != -1) { gf[preV][lastV] = gf[preV][lastV] - cfp; gf[lastV][preV] = gf[lastV][preV] + cfp; f[preV][lastV] = f[preV][lastV] + cfp; f[lastV][preV] = -f[preV][lastV]; lastV = preV; preV = pre[lastV]; } } } int main() { int i, j, tempX, tempY; cin>>hNum>>iNum; end = MAX_NODE + 1; for(i = 1; i <= hNum; i++) { cin>>tempX>>tempY; posH[i][0] = tempX, posH[i][1] = tempY; if(i != 1) graph[100 + i][end] = gf[100 + i][end] = 1; if(i != end - 1) graph[0][i] = gf[0][i] = 1; } for(i = 1; i <= iNum; i++) { cin>>tempX>>tempY; posI[i][0] = tempX, posI[i][1] = tempY; graph[200 + i][300 + i] = gf[200 + i][300 + i] = 1; } for(i = 1; i <=hNum - 1; i++) { for(j = 1; j <= iNum; j++) { double dist1 = sqrt(double(DIST(posH[i][0], posH[i][1], posI[j][0], posI[j][1]))); double dist2 = sqrt(double(DIST(posH[i + 1][0], posH[i + 1][1], posI[j][0], posI[j][1]))); double dist3 = sqrt(double(DIST(posH[i][0], posH[i][1], posH[i + 1][0], posH[i + 1][1]))); if(dist1 + dist2 <= 2 * dist3) { graph[i][200 + j] = gf[i][200 + j] = 1; graph[300 + j][100 + i + 1] = gf[300 + j][100 + i + 1] = 1; } } } admondsKarp(); int nodeCount = hNum; for(i = 1; i <= hNum - 1; i++) { for(j = 1; j <= iNum; j++) if(f[i][j + 200] == 1) nodeCount++; } cout<<nodeCount<<endl; for(i = 1; i <= hNum - 1; i++) { if(i != 1) cout<<" "; cout<<posH[i][0]<<" "<<posH[i][1]; for(j = 1; j <= iNum; j++) if(f[i][j + 200] == 1) cout<<" "<<posI[j][0]<<" "<<posI[j][1]; } cout<<" "<<posH[hNum][0]<<" "<<posH[hNum][1]; cout<<endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator