洛谷 P2770 航空路线问题【最大费用最大流】

记得cnt=1!!因为是无向图所以可以把回来的路看成另一条向东的路。字符串用map处理即可。拆点限制流量,除了1和n是(i,i+n,2)表示可以经过两次,其他点都拆成(i,i+n,1),费用设为1,原图中的边(i,j)连接(i+n,j,1),注意特判掉i==q&&j==nst直接相连的情况,流量要设为2,然后跑最大费用最大流,如果流量小于2就是无解,否则分别从s和tdfs输出方案。
记得输出方案前先输出一次起点。

#include
#include
#include
#include
#include
#include
using namespace std;
const int N=1000005,inf=1e9;
int n,m,s,t,h[N],cnt=1,dis[N],fr[N],a[N][2],ans,sum;
bool v[N];
string c1,c2,ha[N];
mapmp;
struct qwe
{
    int ne,no,to,va,c;
}e[N<<2];
void add(int u,int v,int w,int c)
{
    cnt++;
    e[cnt].ne=h[u];
    e[cnt].no=u;
    e[cnt].to=v;
    e[cnt].va=w;
    e[cnt].c=c;
    h[u]=cnt;
}
void ins(int u,int v,int w,int c)
{//cout<q;
    q.push(s);
    dis[s]=0;
    v[s]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        v[u]=0;
        for(int i=h[u];i;i=e[i].ne)
            if(e[i].va&&dis[e[i].to]>n>>m;
    s=1,t=n+n;
    for(int i=1;i<=n;i++)
    {
        cin>>c1;
        mp[c1]=i;
        ha[i]=c1;
    }
    for(int i=1;i<=m;i++)
    {
        cin>>c1>>c2;//cout<y)
            swap(x,y);
        if(x==1&&y==n)
            ins(x+n,y,2,0);
        else
            ins(x+n,y,1,0);
    }
    ins(1,1+n,2,1);
    ins(n,n+n,2,1);
    for(int i=2;i

转载于:https://www.cnblogs.com/lokiii/p/8428547.html

你可能感兴趣的:(洛谷 P2770 航空路线问题【最大费用最大流】)