标签:single ant round tor line ota com contain friend
Input
Output
Sample Input
4 5 1 2 1 2 3 1 3 4 1 1 3 2 2 4 2
Sample Output
6
题意:节点1把所有的节点都要跑一遍,然后回到节点1,每个边智能跑一次,问最短距离
思路:流量为2的最小费用流
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<stack> #include<cstdlib> #include <vector> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f #define PI acos(-1.0) const int maxn = 1e4+5; const int mod = 1e9+7; typedef pair<int,int>P; struct edge{ int to,cap,cost,rev; }; int V; vector<edge> G[maxn]; int h[maxn]; int dist[maxn]; int prevv[maxn],preve[maxn]; void addedge(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; fill(h,h+V,0); while (f>0) { priority_queue<P,vector<P>,greater<P> > que; fill(dist,dist+V,INF); dist[s] =0; que.push(P(0,s)); while(!que.empty()) { P p=que.top(); que.pop(); int v=p.second; if(dist[v]<p.first) 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+h[v]-h[e.to]) { dist[e.to] = dist[v] + e.cost + h[v] -h[e.to]; prevv[e.to] = v; preve[e.to] = i; que.push(P(dist[e.to],e.to)); } } } if(dist[t] == INF) { return -1; } for(int v=0;v<V;v++) h[v] += dist[v]; 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*h[t]; for(int 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 N,M; int a[maxn],b[maxn],c[maxn]; void solve() { int s=0,t=N-1; V=N; for(int i=0;i<M;i++) { addedge(a[i]-1,b[i]-1,1,c[i]); addedge(b[i]-1,a[i]-1,1,c[i]); } printf("%d\n",min_cost_flow(s,t,2)); } int main() { cin>>N>>M; for(int i=0;i<M;i++) { scanf("%d%d%d",&a[i],&b[i],&c[i]); } solve(); }
标签:single ant round tor line ota com contain friend
原文地址:https://www.cnblogs.com/smallhester/p/10295634.html