1 条题解
-
0
#include<vector> #include<cstdio> #include<algorithm> #define min(x,y) (((x)>(y))?(y):(x)) #define INF 0x3f3f3f3f #define MAX_V 64+16 using namespace std; struct edge { int to,cap,cost,rev; edge(){} edge(int to1,int cap1,int cost1,int rev1) { to=to1; cap=cap1; cost=cost1; rev=rev1; } }; int V; vector<edge>G[MAX_V]; int dist[MAX_V]; int prevv[MAX_V],preve[MAX_V]; void add_edge(int from,int to,int cap,int cost) { G[from].push_back(edge(to,cap,cost,G[to].size())); G[to].push_back(edge(from,0,-cost,G[from].size()-1)); } int min_cost_flow(int s,int t,int f) { int res=0,v; while(f>0) { fill(dist,dist+V,INF); dist[s]=0; bool update=true; while(update) { update=false; for(v=0;v<V;v++) { if(dist[v]==INF) continue; for(int i=0;i<G[v].size();i++) { edge &e=G[v][i]; if(e.cap>0&&dist[e.to]>dist[v]+e.cost) { dist[e.to]=dist[v]+e.cost; prevv[e.to]=v; preve[e.to]=i; update=true; } } } } if(dist[t]==INF) return -1; int d=f; for(int v=t;v!=s;v=prevv[v]) d=min(d,G[prevv[v]][preve[v]].cap); f-=d; res+=d*dist[t]; for(v=t;v!=s;v=prevv[v]) { edge &e=G[prevv[v]][preve[v]]; e.cap-=d; G[v][e.rev].cap+=d; } } return res; } int main() { int i,n,m,id=0; while(~scanf("%d%d",&n,&m)) { V=n+2; if(n==0&&m==0) break; add_edge(0,1,2,0); add_edge(n,n+1,2,0); while(m--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add_edge(a+1,b+1,1,c); } int ans=min_cost_flow(0,n+1,2); printf("Instance #%d: ",++id); if(ans==-1) printf("Not possible\n"); else printf("%d\n",ans); for(i=0;i<=n+1;i++) G[i].clear(); } return 0; }
- 1
信息
- ID
- 2069
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者