J: Our Journey of Dalian Ends
2017-09-10 11:58
309 查看
urumqi-2017-online
存一个学姐用的模板(:з」∠)
因为每个点只能经过一次,拆点,限制为1
以上海为起点
大连和西安两个点再连向终点,限制为1
判断最终流量是否为2就能判断是否从大连开始到西安结束了
存一个学姐用的模板(:з」∠)
因为每个点只能经过一次,拆点,限制为1
以上海为起点
大连和西安两个点再连向终点,限制为1
判断最终流量是否为2就能判断是否从大连开始到西安结束了
#include<bits/stdc++.h> using namespace std; #define N 30005 #define M 60005 #define INF 10000000 #define ms(x,y) memset(x,y,sizeof(x)) const double EPS=1e-9; struct Edge{ int u,v,cap,next; double cost; }edge[M<<1]; int sumFlow,edgeNum,head ,pp ; double dist ; bool inq ; void add(int u,int v,int cap,double cost){ edge[edgeNum].u=u;edge[edgeNum].v=v;edge[edgeNum].cap=cap;edge[edgeNum].cost=cost; edge[edgeNum].next=head[u];head[u]=edgeNum++; edge[edgeNum].u=v;edge[edgeNum].v=u;edge[edgeNum].cap=0;edge[edgeNum].cost=-cost; edge[edgeNum].next=head[v];head[v]=edgeNum++; } bool SPFA(int s,int t,int n){ int i,u,v; queue<int>q; ms(inq,0),ms(pp,-1); for(i=0;i<=n;i++) dist[i]=INF; inq[s]=1;dist[s]=0; q.push(s); while(!q.empty()){ u=q.front();q.pop();inq[u]=0; for(i=head[u];i!=-1;i=edge[i].next){ v=edge[i].v; if(edge[i].cap&&dist[v]>dist[u]+edge[i].cost+EPS){ dist[v]=dist[u]+edge[i].cost; pp[v]=i; if(!inq[v]){ q.push(v); inq[v]=1; } } } } if(pp[t]==-1) return false; return true; } pair<int,double> MCMF(int s,int t,int n){ int flow=0,i,minflow; double mincost=0; while(SPFA(s,t,n)){ minflow=INF; for(i=pp[t];i!=-1;i=pp[edge[i].u]) minflow=min(edge[i].cap,minflow); flow+=minflow; for(i=pp[t];i!=-1;i=pp[edge[i].u]) edge[i].cap-=minflow,edge[i^1].cap+=minflow; mincost+=dist[t]*minflow; } return make_pair(flow,mincost); } map<string,int>MP; int main() { int t,n,m,i,u ,v ,w ; scanf("%d",&t); while(t--){ edgeNum=0,ms(head,-1); MP.clear(); MP["Shanghai"]=1; MP["Dalian"]=2; MP["Xian"]=n=3; scanf("%d",&m); string s; for(i=1;i<=m;i++){ cin>>s; if(MP.find(s)==MP.end()) MP[s]=++n; u[i]=MP[s]; cin>>s; if(MP.find(s)==MP.end()) MP[s]=++n; v[i]=MP[s]; scanf("%d",&w[i]); } for(i=1;i<=m;i++) if(u[i]==1) add(u[i],v[i],1,w[i]); else if (v[i]==1) add(v[i],u[i],1,w[i]); else add(u[i]+n-1,v[i],1,w[i]),add(v[i]+n-1,u[i],1,w[i]); // add(0,1,2,0); for(i=2;i<=n;i++) add(i,i+n-1,1,0); add(2+n-1,2*n,1,0); add(3+n-1,2*n,1,0); pair<int,double> p=MCMF(1,2*n,2*n); if(p.first==2) printf("%.0f\n",p.second); else puts("-1"); } }
相关文章推荐
- Our Journey of Dalian Ends (最小费用最大流)
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 J. Our Journey of Dalian Ends [网络流]
- Our Journey of Dalian Ends
- ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends
- Our Journey of Dalian Ends【网络流】
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 J.Our Journey of Dalian Ends【最小费用最大流】
- 【2017新疆网络赛】Our Journey of Dalian Ends 费用流
- 计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-J-Our Journey of Dalian Ends
- 计蒜客 Our Journey of Dalian Ends 最小费用最大流
- 计蒜客 Our Journey of Dalian Ends(17新疆网赛) 费用流(思维建图)
- 计蒜客 Our Journey of Dalian Ends 拆点+最小费用最大流
- 【2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛】 J Our Journey of Dalian Ends 【拆点费用流】
- 计蒜客-乌鲁木齐网络赛&费用流&拆点-Our Journey of Dalian Ends
- 计蒜客 16959 Our Journey of Dalian Ends(2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 J)
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 - J Our Journey of Dalian Ends(最小费用最大流)
- 计蒜客:2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛:Our Journey of Dalian Ends
- 计蒜客 16959 Our Journey of Dalian Ends(最小费用最大流-mcmf)
- Our Journey of Dalian Ends 乌鲁木齐网络赛 最小费用最大流
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 [计蒜客] Our Journey of Dalian Ends
- 2017ICPC青岛K Our Journey of Xian Ends