• 【分类讨论】Codeforces Round #407 (Div. 2) D. Weird journey


    考虑这个二元组中有一者是自环,则必然合法。

    考虑这两条边都不是自环,如果它们不相邻,则不合法,否则合法。

    坑的情况是,如果它是一张完整的图+一些离散的点,则会有解,不要因为图不连通,就误判成无解。

    #include<cstdio>
    #include<iostream>
    using namespace std;
    typedef long long ll;
    ll ans;
    int n,m,zihuan;
    int v[2000010],next[2000010],first[2000010],e;
    void AddEdge(int U,int V){
    	v[++e]=V;
    	next[e]=first[U];
    	first[U]=e;
    }
    bool vis[2000010];
    void dfs(int U){
    	vis[U]=1;
    	for(int i=first[U];i;i=next[i]){
    		if(!vis[v[i]]){
    			dfs(v[i]);
    		}
    	}
    }
    int main(){
    //	freopen("d.in","r",stdin);
    	int x,y;
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;++i){
    		scanf("%d%d",&x,&y);
    		if(x==y){
    			++zihuan;
    		}
    		AddEdge(x,y);
    		AddEdge(y,x);
    	}
    	for(int i=1;i<=n;++i){
    		if(first[i]){
    			dfs(i);
    			break;
    		}
    	}
    	for(int i=1;i<=n;++i){
    		if((!vis[i]) && first[i]){
    			puts("0");
    			return 0;
    		}
    	}
    	ans=(ll)(zihuan-1)*(ll)(zihuan)/2ll+(ll)zihuan*(ll)(m-zihuan);
    	for(int i=1;i<=n;++i){
    		int cnt=0;
    		for(int j=first[i];j;j=next[j]){
    			if(v[j]!=i){
    				++cnt;
    			}
    		}
    		ans+=(ll)cnt*(ll)(cnt-1)/2ll;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
  • 相关阅读:
    函数调用本质
    互联网协议入门
    iOS开发系列-Block本质篇
    iOS组件化开发-CocoaPods简介
    版本控制-Git
    iOS开发系列-NSDate
    iOS开发系列-线程同步技术
    Python 抓取网页gb2312乱码问题
    常用正则表达式
    Java 命名规范
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6644766.html
Copyright © 2020-2023  润新知