标签:width pos over 没有 develop ddr time near ever
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 4914 | Accepted: 1284 | Special Judge |
Description
Input
Output
Sample Input
3 4 -3 3 5 -2 -2 6 2 2 5 -1 1 3 1 1 4 -2 -2 7 0 -1 3 3 1 1 0 0 0 6 0 0 3 0 2
Sample Output
SUBOPTIMAL 3 0 1 1 0 0 6 0 0 4 0 1
题目链接:http://poj.org/problem?id=2175
题意:有n栋建筑,m个防空洞,现在市政府给出了一个逃生方案,问有没有一个更好的方案,有的话,输出方案。
思路:最小费用最大流。流量为人数,花费为距离。不知道是不是写矬了,用连续最短路求最小费用最大流一直TLE。改成用消负圈法,即不断的消去负圈而得到最小费用流。应为是任意两点间的最短路径并且含有负边,用Floyd算法。
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<set> #include<map> #include<queue> #include<stack> #include<vector> using namespace std; typedef long long ll; typedef pair<int,int> P; #define PI acos(-1.0) const int maxn=3e2+100,maxm=1e5+100,inf=0x3f3f3f3f,mod=1e9+7; const ll INF=1e18+7; int n,m; int NN; struct node { int x,y; int cou; } b[maxn],c[maxn]; int E[maxn][maxn]; int g[maxn][maxn]; int prevv[maxn][maxn]; int used[maxn]; void solve() { for(int i=1; i<NN; i++) { for(int j=1; j<NN; j++) prevv[i][j]=i; } for(int k=1; k<NN; k++) { for(int i=1; i<NN; i++) { for(int j=1; j<NN; j++) { if(g[i][j]>g[i][k]+g[k][j]) { g[i][j]=g[i][k]+g[k][j]; prevv[i][j]=prevv[k][j]; if(i==j&&g[i][j]<0) { fill(used,used+NN,0); for(int v=i; !used[v]; v=prevv[i][v]) { used[v]=1; if(v!=n+m+1&&prevv[i][v]!=n+m+1) { if(v>n) E[prevv[i][v]][v-n]++; else E[v][prevv[i][v]-n]--; } } cout<<"SUBOPTIMAL"<<endl; for(int x=1; x<=n; x++) { for(int y=1; y<m; y++) cout<<E[x][y]<<" "; cout<<E[x][m]<<endl; } return; } } } } } cout<<"OPTIMAL"<<endl; } int main() { scanf("%d%d",&n,&m); int s=0,t=n+m+1; NN=t+1; int f=0; for(int i=1; i<=n; i++) scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].cou); for(int i=1; i<=m; i++) scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].cou); for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) scanf("%d",&E[i][j]); } for(int i=0; i<NN; i++) fill(g[i],g[i]+NN,inf); for(int j=1; j<=m; j++) { int sum=0; for(int i=1; i<=n; i++) { int d=abs(b[i].x-c[j].x)+abs(b[i].y-c[j].y)+1; g[i][j+n]=d; if(E[i][j]>0) g[j+n][i]=-d; sum+=E[i][j]; } if(sum>0) g[n+m+1][j+n]=0; if(sum<c[j].cou) g[j+n][n+m+1]=0; } solve(); return 0; }
标签:width pos over 没有 develop ddr time near ever
原文地址:http://www.cnblogs.com/GeekZRF/p/7254048.html