#include #include #include #include #define Max 305 #define inf 99999999 using namespace std; int n,m,k,p; bool visitedX[Max],visitedY[Max]; int lx[Max],ly[Max]; int Match[Max]; int slack[Max]; int Graph[Max][Max]; int o[Max]; struct node { int adj[Max],w[Max]; int len; }list[Max]; void AddAdj(int s,int e,int w) { list[s].adj[list[s].len] = e; list[s].w[list[s].len++] = w; } void SPFA(int locate) { int dist[Max],i,u,v,w; bool visited[Max]; queueq; for(i=1;i<=n+m;i++) visited[i] = 0,dist[i] = inf; visited[locate] = 1; dist[locate] = 0; q.push(locate); while (!q.empty()) { u = q.front(); q.pop(); visited[u] = 0; for (i=0;idist[u]+w) { dist[v] = dist[u]+w; if(!visited[v]) q.push(v),visited[v] = 1; } } } for (i=m+1;i<=m+n;i++) { if(dist[i]!=0x7fffffff) Graph[locate][i] = -dist[i]; else Graph[locate][i] = 0; } } bool DFS(int i) { int j,tem; visitedX[i] = true; for (j=m+1;j<=n+m;j++) { if (!visitedY[j]) { tem = lx[i]+ly[j]-Graph[i][j]; if (tem==0) { visitedY[j] = 1; if (Match[j]==-1||DFS(Match[j])) { Match[j] = i; return true; } } else if(slack[j]>tem) slack[j] = tem; } } return false; } void KM() { int i,j,k,min; for (i=1;i<=n;i++) { lx[o[i]] = -inf; ly[i+m] = 0; Match[i+m] = -1; for (j=m+1;j<=m+n;j++) if(lx[o[i]]