HDU 5352 MZL's City(2015 多校 第5场,最小费用最大流)

 

MZL‘s City

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 291    Accepted Submission(s): 94

Problem Description

MZL is an active girl who has her own country.

Her big country has N cities numbered from 1 to N.She has controled the country for so long and she only remebered that there was a big earthquake M years ago,which made all the roads between the cities destroyed and all the city became broken.She also remebered
that exactly one of the following things happened every recent M years:

1.She rebuild some cities that are connected with X directly and indirectly.Notice that if a city was rebuilt that it will never be broken again.

2.There is a bidirectional road between city X and city Y built.

3.There is a earthquake happened and some roads were destroyed.

She forgot the exactly cities that were rebuilt,but she only knew that no more than K cities were rebuilt in one year.Now she only want to know the maximal number of cities that could be rebuilt.At the same time she want you to tell her the smallest lexicographically
plan under the best answer.Notice that 8 2 1 is smaller than 10 0 1.

Input

The first contains one integer T(T<=50),indicating the number of tests.

For each test,the first line contains three integers N,M,K(N<=200,M<=500,K<=200),indicating the number of MZL’s country ,the years happened a big earthquake and the limit of the rebuild.Next M lines,each line contains a operation,and the format is “1 x” , “2
x y”,or a operation of type 3.

If it’s type 3,first it is a interger p,indicating the number of the destoyed roads,next 2*p numbers,describing the p destoyed roads as (x,y).It’s guaranteed in any time there is no more than 1 road between every two cities and the road destoyed must exist
in that time.

Output

The First line Ans is the maximal number of the city rebuilt,the second line is a array of length of tot describing the plan you give(tot is the number of the operation of type 1).

Sample Input

1
5 6 2
2 1 2
2 1 3
1 1
1 2
3 1 1 2
1 2

Sample Output

3
0 2 1

Hint

 No city was rebuilt in the third year,city 1 and city 3 were rebuilt in the fourth year,and city 2 was rebuilt in the sixth year.

Source

2015
Multi-University Training Contest 5

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#define LL long long
using namespace std;
const int maxn = 10000 + 10;
const int INF = 0x3f3f3f3f;
struct Edge
{
	int from, to, cap, flow, cost;
	Edge(int u, int v, int c, int f, int w) : from(u), to(v), cap(c), flow(f), cost(w) { }
};
int n;
vector<Edge>edges;
vector<int>G[maxn];
int inq[maxn];
int d[maxn];
int p[maxn];
int a[maxn];
void init()
{
	for(int i=0;i<maxn;i++)
		G[i].clear();
	edges.clear();
}
void AddEdge(int from, int to, int cap, int cost)
{
	edges.push_back(Edge(from,to,cap,0,cost));
	edges.push_back(Edge(to,from,0,0,-cost));
	int M = edges.size();
	G[from].push_back(M-2);
	G[to].push_back(M-1);
}
bool SPFA(int s, int t, int& flow, LL& cost)
{
	for(int i=0;i<=n+1;i++)
 		d[i] = INF;
	memset(inq, 0, sizeof(inq));
	d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = INF;
	queue<int>Q;
	Q.push(s);
	while(!Q.empty())
	{
		int u = Q.front();Q.pop();
		inq[u] = 0;
		for(int i=0;i<G[u].size();i++)
		{
			Edge& e = edges[G[u][i]];
			if(e.cap > e.flow && d[e.to] > d[u] + e.cost)
			{
				d[e.to] = d[u] + e.cost;
				p[e.to] = G[u][i];
				a[e.to] = min(a[u], e.cap - e.flow);
				if(!inq[e.to]){Q.push(e.to);inq[e.to] = 1;}
			}
		}
	}
	if(d[t] == INF) return false;
	flow += a[t];
	cost += (LL) d[t] * (LL) a[t];
	for(int u=t;u!=s;u=edges[p[u]].from)
	{
		edges[p[u]].flow += a[t];
		edges[p[u]^1].flow -= a[t];
	}
	return true;
}
int MincostMaxflow(int s, int t, LL& cost)
{
	int flow = 0; cost = 0;
	while(SPFA(s,t,flow,cost));
	return flow;
}
int dis[210][210], vis[210];
int N, M, K;
void dfs(int u)
{
    vis[u] = 1;
    for(int i=1;i<=N;i++)
    {
        if(!vis[i] && dis[u][i])
            dfs(i);
    }
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        init();
        memset(dis, 0, sizeof(dis));
        scanf("%d%d%d", &N, &M, &K);
        int op, x, y;
        int s = 0, t = N + 1;
        int tt = N + 2, COST = M + 10;
        for(int i=1;i<=N;i++) AddEdge(i, t, 1, 0);
        for(int i=1;i<=M;i++)
        {
            scanf("%d", &op);
            if(op == 1)
            {
                memset(vis, 0, sizeof(vis));
                scanf("%d", &x);
                dfs(x);
                AddEdge(s, tt, K, COST);
                COST--;
                for(int j=1;j<=N;j++) if(vis[j])
                    AddEdge(tt, j, 1, 0);
                tt++;
            }
            else if(op == 2)
            {
                scanf("%d%d", &x, &y);
                dis[x][y] = dis[y][x] = 1;
            }
            else
            {
                int e; scanf("%d", &e);
                while(e--)
                {
                    scanf("%d%d", &x, &y);
                    dis[x][y] = 0;
                    dis[y][x] = 0;
                }
            }
        }
        n = tt;
        LL ans;
        int flow = MincostMaxflow(s, t, ans);
        printf("%d\n", flow);
        int flag = 0;
        for(int i=0;i<edges.size();i++)
        {
            if(flag == 0 && edges[i].from == s)
            {
                printf("%d", edges[i].flow);
                flag = 1;
            }
            else if(edges[i].from == s)
            {
                printf(" %d", edges[i].flow);
            }
        }
        printf("\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 5352 MZL's City(2015 多校 第5场,最小费用最大流)

时间: 2024-08-02 01:53:33

HDU 5352 MZL's City(2015 多校 第5场,最小费用最大流)的相关文章

hdu 5352 MZL&#39;s City 【二分图】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5352 题意: 给你n,m,k 表示n个建筑 m次操作,修复操作每次最多修复k个建筑. 有三种操作 1.修复x点周围建筑(<=k) 2.x,y建筑间建边 3.x,y间删边 修复建筑时候拆点建图.反着求最大匹配,保证字典序最小. 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <l

HDU 5352 MZL&#39;s City

最小费用最大流,因为要控制字典序,网络流控制不好了...一直WA,所以用了费用流,时间早的费用大,时间晚的费用少. 构图: 建立一个超级源点和超级汇点.超级源点连向1操作,容量为K,费用为COST,然后COST-1,因为下一次遇到1操作,费用为减少1,即COST-1: 每个1操作连向当前能建造的城市,容量为1,费用为0: 每个城市连向汇点,容量为1,费用为0: #include<cstdio> #include<cstring> #include<cmath> #inc

HDU 5352——MZL&#39;s City——————【二分图多重匹配、拆点】

MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 710    Accepted Submission(s): 245 Problem Description MZL is an active girl who has her own country. Her big country has N cities numb

Hdu 5352 MZL&#39;s City (多重匹配)

题目链接: Hdu 5352 MZL's City 题目描述: 有n各节点,m个操作.刚开始的时候节点都是相互独立的,一共有三种操作: 1:把所有和x在一个连通块内的未重建过的点全部重建. 2:建立一条双向路(x,y) 3:又发生了地震,p条路被毁. 问最后最多有多少个节点被重建,输出重建节点的最小字典序. 解题思路: 这几天正好在学匹配,但是昨天下午还是没有看出来这个是匹配题目.看了题解扪心自问了自己三次,是不是傻.就是把每个需要重建的节点x拆成k个点,然后对每个拆分后的点和与拆点在同一连通块

hdu 5352 MZL&#39;s City 最小费用最大流

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5352 题意:M年前有一个国家发生了地震.所有城市和城市之间的路都被摧毁了.现在要重建城市. 给出一个N表示共有N个城市,M表示大地震发生在M年前,K表示每次最多只能重建K个城市. 现在从大地震发生的那年开始,每年可以进行一个操作,也就是总共有M个操作. 1 x表示可以重建和x联通(直接或间接)的城市(包括x本身),每次最多只能重建K个城市 2 x y 表示修建了一条城市x到城市y的路. 3操作给出一

HDU 5305 Friends (搜索+剪枝) 2015多校联合第二场

開始对点搜索,直接写乱了.想了想对边搜索,尽管复杂度高.剪枝一下水过去了. 代码: #include<cstdio> #include<iostream> #include<cstring> #include<vector> using namespace std; struct Edge{ int a,b; }G[35]; int n,m,deg[10],on[10],off[10]; int res; void init(){ memset(deg,0,

HDU 5334 Virtual Participation(2015多校第四场)

Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he asks rikka to have some practice on codeforces. Then she opens the problem B: Given an integer K, she needs to come up with an sequence of integers A 

HDU 5344 MZL&#39;s xor (多校)[补7月28]

MZL's xor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 249    Accepted Submission(s): 187 Problem Description MZL loves xor very much.Now he gets an array A.The length of A is n.He wants to k

HDOJ 5352 MZL&#39;s City 匈牙利匹配

求年份和城市的匹配 MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 539    Accepted Submission(s): 180 Problem Description MZL is an active girl who has her own country. Her big country has N