标签:des style blog http color os io strong
解题报告
题意:
一个人有n个农场,他想从1到n去,有从n到1回来,要求路径最短,且没有走重复的路。
思路:
如果两次最短路感觉不行的,可以看成费用流,每一条路容量都是1,这样只要流量等于2就行了。
一次mcmf模版。
#include <iostream> #include <cstring> #include <queue> #include <cstdio> #define inf 0x3f3f3f3f using namespace std; int head[2010],dis[2010],vis[2010],pre[2010],f[2010],cnt,flow,cost,s,t,n,m; struct node { int v,cap,cost,next; } edge[50000]; void add(int u,int v,int cost,int cap) { edge[cnt].v=v,edge[cnt].cost=cost,edge[cnt].cap=cap; edge[cnt].next=head[u],head[u]=cnt++; edge[cnt].v=u,edge[cnt].cost=-cost,edge[cnt].cap=0; edge[cnt].next=head[v],head[v]=cnt++; } int _spfa() { queue<int>Q; Q.push(s); for(int i=1; i<=n; i++)dis[i]=inf,pre[i]=vis[i]=f[i]=0; dis[s]=0,vis[s]=1,pre[s]=-1,f[s]=inf; while(!Q.empty()) { int u=Q.front(); Q.pop(); vis[u]=0; for(int i=head[u]; i!=-1; i=edge[i].next) { int v=edge[i].v; if(edge[i].cap&&dis[v]>dis[u]+edge[i].cost) { pre[v]=i; f[v]=min(edge[i].cap,f[u]); dis[v]=dis[u]+edge[i].cost; if(!vis[v]) { vis[v]=1; Q.push(v); } } } } if(dis[t]==inf)return 0; flow+=f[t]; cost+=f[t]*dis[t]; if(flow==2)return 0; for(int i=pre[t]; i!=-1; i=pre[edge[i^1].v]) { edge[i].cap-=f[t]; edge[i^1].cap+=f[t]; } return 1; } void mcmf() { cost=flow=0; while(_spfa()); printf("%d\n",cost); } int main() { int u,v,w; memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); s=1; t=n; while(m--) { scanf("%d%d%d",&u,&v,&w); add(u,v,w,1); add(v,u,w,1); } mcmf(); return 0; }
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11402 | Accepted: 4230 |
Description
Input
Output
Sample Input
4 5 1 2 1 2 3 1 3 4 1 1 3 2 2 4 2
Sample Output
6
POJ2135_Farm Tour(网络流/费用流),布布扣,bubuko.com
标签:des style blog http color os io strong
原文地址:http://blog.csdn.net/juncoder/article/details/38639071