zoukankan      html  css  js  c++  java
  • Hoj 13963 Airports 最大匹配/最小路径覆盖

    //和老赵简单讨论了一下 就学会了 感觉自己好机智

    http://blog.csdn.net/l04205613/article/details/6278394

    #include <iostream> #include <algorithm> #include <stdio.h> #include <set> #include <queue> #include <cstring> #include <string> #include <limits.h> #include <string.h> #include <vector> #include <map> #define LL long long #define INF 2100000000 #define fi first #define se second #define lowbit(x) (x&(-x)) #define eps 5e-7 using namespace std; const int maxn=(int)5e2 +10; const int maxm=(int)2e4+10; const LL MOD=(LL)1e9+7; int n,m; int p[maxn]; int mp[maxn][maxn]; struct nod{     int u,v,t;     void in(){scanf("%d%d%d",&u,&v,&t);} }; nod f[maxn]; int dis[maxn][maxn]; bool canbetrans(const nod&a,const nod&b){     return a.t+mp[a.u][a.v]+dis[a.v][b.u]<=b.t; } vector<int> e[maxn]; queue<int> q; bool vis[maxn]; void spfa(int st,int d[maxn]){     while(!q.empty())q.pop();     for(int i=1;i<=n;i++)d[i]=INF,vis[i]=false;     d[st]=0;vis[st]=true;q.push(st);     while(!q.empty()    ){         int u=q.front();q.pop();vis[u]=false;         for(int i=1;i<=n;i++){             if(d[u]+mp[u][i]<d[i]){                 d[i]=d[u]+mp[u][i];                 if(!vis[i]) {q.push(i);vis[i]=true;}             }         }     } } int mat[maxn]; bool found(int k){     for(int i=0;i<e[k].size();i++){         int to=e[k][i];         if(vis[to])continue;         vis[to]=true;         if(mat[to]==-1||found(mat[to])){             mat[to]=k;             return true;         }     }     return false; } int match(){     memset(mat,-1,sizeof mat);     int res=0;     for(int i=0;i<m;i++){         memset(vis,0,sizeof vis);         if(found(i)) res++;     }     return res; } int main() { #ifdef shuaishuai     freopen("C:\Users\hasee\Desktop\a.txt","r",stdin);     //freopen("C:\Users\hasee\Desktop\b.txt","w",stdout); #endif     scanf("%d%d",&n,&m);     for(int i=1;i<=n;i++)scanf("%d",p+i);     for(int i=1;i<=n;i++)         for(int j=1;j<=n;j++)         {             scanf("%d",&mp[i][j]);             mp[i][j]+=i==j? 0: p[j];         }     for(int i=1;i<=n;i++)spfa(i,dis[i]);     int ans=0;     for(int i=0;i<m;i++){         f[i].in();     }     for(int i=0;i<m;i++){         for(int j=0;j<i;j++){             if(canbetrans(f[i],f[j])) e[i].push_back(j);             if(canbetrans(f[j],f[i])) e[j].push_back(i);         }     }     printf("%d ",m-match());     return 0; }
  • 相关阅读:
    在sublime中安装使用TortoiseSVN-sublime使用心得(4)
    怎么在sublime/emmet中加自定义的内容-sublime使用心得(3)
    Function学习
    null类型
    undefined类型
    《SQL语句的基本语法》《转》
    《SQL SERVER的数据类型》《转》
    SQL语句《转》
    Delphi防止多实例运行的两种方法《转》
    1.简单计算器
  • 原文地址:https://www.cnblogs.com/MeowMeowMeow/p/7478337.html
Copyright © 2011-2022 走看看