HDU 3435 费用流

点击打开链接

题意:给个无向的图,问你删除任意边后,使这个图是哈密顿图,若有多个,输出路径上的所有权值和最小,没有就输出NO

思路:今天开始从10年多校开始刷题,敌人留给我们的时间不多了,这题看完题意后,看了看样例,自己yy了一下,写了一发,交了ac,看了样例后我是这样想的,因为是哈密顿图,那么每个点肯定是走了两次,而图是无向图,和求最大匹配有些类似,然后就瞎YY的过了

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int maxn=2010;
typedef pair P;
struct edge{
    int to,cap,rev,cost;
    edge();
    edge(int a,int b,int c,int d){to=a,cap=b,cost=c,rev=d;};
};
vectorG[maxn];
int h[maxn],dis[maxn];
int prevv[maxn],preve[maxn];
void add_edge(int st,int en,int cap,int cost){
    G[st].push_back(edge(en,cap,cost,G[en].size()));
    G[en].push_back(edge(st,0,-cost,G[st].size()-1));
}
int min_cost_flow(int st,int en,int f){
    int ans=0;
    memset(h,0,sizeof(h));
    while(f>0){
        priority_queue,greater

>que; for(int i=0;i0&&dis[e.to]>dis[v]+e.cost+h[v]-h[e.to]){ dis[e.to]=dis[v]+e.cost+h[v]-h[e.to]; prevv[e.to]=v; preve[e.to]=i; que.push(P(dis[e.to],e.to)); } } } if(dis[en]==inf) return -1; for(int i=0;i


你可能感兴趣的:(图论,网络流,费用流,线段树)