zoukankan      html  css  js  c++  java
  • BZOJ3832: [Poi2014]Rally

    BZOJ3832: [Poi2014]Rally

    https://lydsy.com/JudgeOnline/problem.php?id=3832

    分析:

    • 新建源点向所有点连边,所有点向汇点连边。
    • (f)表示到这个点的最长路,(g)表示从这个点出发的最长路。
    • 那么一条边((u,v))的贡献就是(f_u+g_v+1)
    • 考虑用堆维护所有的边。堆中一开始无边。
    • 按拓扑序删点,删一个点之前删掉连向它的边,统计答案后再加入它连出的边。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <vector>
    using namespace std;
    #define N 1000050
    template <typename T> void chkmax(T &x,T y) {if(x<y) x=y;}
    template <typename T> void chkmin(T &x,T y) {if(y<x) x=y;}
    int head[N],to[N<<1],nxt[N<<1],cnt,n,m,Q[N],du[N],f[N],g[N],vis[N];
    priority_queue<int>q;
    vector<int>v[N];
    inline void add(int u,int v) {
    	to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
    }
    int main() {
    	scanf("%d%d",&n,&m);
    	int s=n+1,t=n+2;
    	int i,x,y,l=0,r=0;
    	for(i=1;i<=m;i++) scanf("%d%d",&x,&y),add(x,y),du[y]++,v[y].push_back(x);
    	for(i=1;i<=n;i++) add(s,i),add(i,t),v[i].push_back(s),v[t].push_back(i),du[i]++,du[t]++;
    	Q[r++]=s;
    	while(l<r) {
    		x=Q[l++]; 
    		for(i=head[x];i;i=nxt[i]) {
    			du[to[i]]--;
    			chkmax(f[to[i]],f[x]+1);
    			if(!du[to[i]]) Q[r++]=to[i];
    		}
    	}
    	for(y=r-1;y>=0;y--) {
    		x=Q[y]; 
    		int lim=v[x].size();
    		for(i=0;i<lim;i++) {
    			chkmax(g[v[x][i]],g[x]+1);
    		}
    	}
    	int ans=1<<30,p=0;
    	for(y=0;y<r;y++) {
    		x=Q[y];
    		int lim=v[x].size();
    		for(i=0;i<lim;i++) {
    			vis[f[v[x][i]]+g[x]+1]++;	
    		}
    		while(!q.empty()&&vis[q.top()]) vis[q.top()]--,q.pop();
    		if(!q.empty()) {
    			if(ans>q.top()) {
    				ans=q.top(); p=x;
    			}
    		}
    		for(i=head[x];i;i=nxt[i]) q.push(f[x]+g[to[i]]+1);
    	}
    	printf("%d %d
    ",p,ans-2);
    }
    
  • 相关阅读:
    匈牙利算法-二分图的最大匹配
    UOJ 407(IOI2018 D1T3)
    UOJ 460
    UOJ 405(IOI2018 D1T1)
    Codeforces 1110E
    2.文件结构
    1.常用快捷键
    Python3.x和Python2.x的差异
    javascript 常用内置对象
    94. Binary Tree Inorder Traversal(非递归实现二叉树的中序遍历)
  • 原文地址:https://www.cnblogs.com/suika/p/10205210.html
Copyright © 2011-2022 走看看