zoukankan      html  css  js  c++  java
  • Exchanging Gifts 【拓扑】

    来源

    https://codeforces.com/gym/102394/problem/E

    思路

    代码

    拓扑排序

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef double db;
    #define pb push_back 
    #define sz(x) (x).size()
    #define dd(x) cout<<#x<<'='<<x<<' '
    #define de(x) cout<<#x<<'='<<x<<endl
    #define fi first
    #define se second
    
    inline bool read(ll &ret){
    	char c;
    	ll sgn;
    	if(c=getchar(),c==EOF){
    		return 0;
    	}
    	while(c!='-'&&(c<'0'||c>'9')){
    		c=getchar();
    	}
    	sgn=(c=='-')?-1:1;
    	ret=(c=='-')?0:(c-'0');
    	while(c=getchar(),c>='0'&&c<='9'){
    		ret=ret*10+(c-'0');
    	}
    	ret*=sgn;
    	return 1;
    }
    
    
    
    vector<ll> fa[1000010];
    vector<ll> a[1000010];
    ll kk[1000010],du[1000010];
    
    unordered_map<ll,ll> cnt;
    ll maxx,sum;
    
    void topo(ll st,ll n){
    	cnt.clear();
    	maxx=sum=0;
    	queue<ll> q;
    	for (int i=1; i<=n; i++)
    		if (du[i]==0) q.push(i);
    	kk[st]=1;
    	while (!q.empty()){
    		ll u=q.front();
    		q.pop();
    		if (fa[u].empty()){
    			for (ll i=0; i<sz(a[u]); i++){
    //				dd(it.fi),de(it.se);
    				cnt[a[u][i]]+=kk[u];
    				maxx=max(maxx,cnt[a[u][i]]);
    				sum+=kk[u];
    			}
    		}
    		else{
    			for (ll i=0; i<sz(fa[u]); i++){
    				ll v=fa[u][i];
    				du[v]--;
    				kk[v]+=kk[u];
    				if (du[v]==0) q.push(v);
    			}
    			
    		}
    	}
    //	dd(sum),de(maxx);
    }
    
    
    
    int main(){
    //	ios::sync_with_stdio(false);
    //	cin.tie(0);
    //	cout.tie(0);
    	ll t;
    	read(t);
    	while (t--){
    		ll n;
    		read(n);
    		for (ll i=1; i<=n; i++){
    			ll op;
    			read(op);
    			if (op==1){
    				ll k;
    				read(k);
    				for (ll j=1; j<=k; j++){
    					ll qq;
    					read(qq);
    					a[i].pb(qq);
    				}
    			}
    			if (op==2){
    				ll x,y;
    				read(x);
    				read(y);
    				fa[i].pb(x);
    				fa[i].pb(y);
    				du[x]++;
    				du[y]++;
    			}
    		}
    		topo(n,n);
    		if (maxx>sum-maxx) cout<<(sum-maxx)*2LL<<endl;
    		else cout<<sum<<endl;
    		for (ll i=0; i<=n; i++) a[i].clear();
    		for (ll i=0; i<=n; i++) fa[i].clear();
    		for (ll i=0; i<=n; i++) du[i]=kk[i]=0;
    	}
    	return 0;
    }
    

    改进后

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef double db;
    #define pb push_back 
    #define sz(x) (x).size()
    #define dd(x) cout<<#x<<'='<<x<<' '
    #define de(x) cout<<#x<<'='<<x<<endl
    #define fi first
    #define se second
    
    inline bool read(ll &ret){
    	char c;
    	ll sgn;
    	if(c=getchar(),c==EOF){
    		return 0;
    	}
    	while(c!='-'&&(c<'0'||c>'9')){
    		c=getchar();
    	}
    	sgn=(c=='-')?-1:1;
    	ret=(c=='-')?0:(c-'0');
    	while(c=getchar(),c>='0'&&c<='9'){
    		ret=ret*10+(c-'0');
    	}
    	ret*=sgn;
    	return 1;
    }
    
    
    
    vector<ll> fa[1000010];
    vector<ll> a[1000010];
    ll kk[1000010],du[1000010];
    
    map<ll,ll> cnt;
    ll maxx,sum;
    
    int main(){
    	ll t;
    	read(t);
    	while (t--){
    		ll n;
    		read(n);
    		for (ll i=1; i<=n; i++){
    			ll op;
    			read(op);
    			if (op==1){
    				ll k;
    				read(k);
    				for (ll j=1; j<=k; j++){
    					ll qq;
    					read(qq);
    					a[i].pb(qq);
    				}
    			}
    			if (op==2){
    				ll x,y;
    				read(x);
    				read(y);
    				fa[i].pb(x);
    				fa[i].pb(y);
    				du[x]++;
    				du[y]++;
    			}
    		}
    		cnt.clear();
    		kk[n]=1;
    		maxx=sum=0;
    		for (int i=n; i>=1; i--){
    			if (fa[i].empty()){
    				for (int j=0; j<sz(a[i]); j++){
    					cnt[a[i][j]]+=kk[i];
    					maxx=max(maxx,cnt[a[i][j]]);
    					sum+=kk[i];
    				}
    			}
    			else{
    				for (int j=0; j<sz(fa[i]); j++){
    					kk[fa[i][j]]+=kk[i];
    				}
    			}
    		}
    //		cout<<maxx<<' '<<sum<<endl;
    		if (maxx>sum-maxx) cout<<(sum-maxx)*2LL<<endl;
    		else cout<<sum<<endl;
    		for (ll i=0; i<=n; i++) a[i].clear();
    		for (ll i=0; i<=n; i++) fa[i].clear();
    		for (ll i=0; i<=n; i++) du[i]=kk[i]=0;
    	}
    	
    	return 0;
    }
    

    参考文献

    [1] https://blog.csdn.net/weixin_42856843/article/details/104460891

  • 相关阅读:
    定义全局时间过滤器
    vue局部过滤器和全局过滤器
    vue-ref指令
    vue进行代码排序
    vue-通过name进行数据过滤
    将vue文档下载到本地预览
    由于vue的for循环id并不严谨,提高id严谨性
    vue指令v-for报错:Elements in iteration expect to have 'v-bind:key' directives.eslint-plugin-vue
    FlowPortal BPM历史版本升级说明
    102从 Outlook 中将电子邮件、联系人和日历导出到 .pst 文件
  • 原文地址:https://www.cnblogs.com/fzulinxin/p/13867674.html
Copyright © 2011-2022 走看看