• codeforces 407 div1 B题(Weird journey)


    codeforces 407 div1 B题(Weird journey)

    传送门

    题意:
    给出一张图,n个点m条路径,一条好的路径定义为只有2条路径经过1次,m-2条路径经过2次,图中存在自环。问满足条件的路径数

    题解:
    推论:对于一条边u-->v,我们将其选作为那两条边之一,那么剩下一条边必然与之相邻或者是自环,因为这样才能满足这两条边只走1次。
    那么这条边的贡献值为这条边的相邻边数+自环数,假如这条边本身为自环,那么由于剩下的边可以任选(前一个推论),贡献值为m-1

    这个AC时间很6啊23333

    import java.io.*;
    import java.util.*;
    
    public class Main {
    	static class MyInputStream extends InputStream {
    		public BufferedInputStream bis = new BufferedInputStream(System.in);
    
    		public int read() throws IOException {
    			int i;
    			while ((i = bis.read()) < 48)
    				if (i == -1)
    					return -1;
    			int temp = 0;
    			while (i > 47) {
    				temp = temp * 10 + i - 48;
    				i = bis.read();
    			}
    			return temp;
    		}
    	}
        
    	static class node{
    		public int from,to;
    		node(){
    			from=to=0;
    		}
    	};
    	static final int N = (int)1e6+10;
    	static int fa[]=new int[N];
    	static node a[]=new node[N];
    	static int in[]=new int[N];
    	static int siz[]=new int[N];
    	private static MyInputStream cin;
        static int find(int x){
        	if(fa[x]==-1) return x;
    		fa[x]=find(fa[x]);
    		return fa[x];
        }
    	public static void main(String[] args) throws IOException{
    		cin = new MyInputStream();
    		//while (true) 
    		{
    			int n = cin.read(),m=cin.read();
    			int u,v,f1,f2,loop=0;
    			Arrays.fill(fa, -1);
    			Arrays.fill(in, 0);
    			Arrays.fill(siz, 0);
    			for(int i=0;i<m;i++){
    				u=cin.read();v=cin.read();
    				if(a[i]==null) a[i]=new node();
    				a[i].from=u;a[i].to=v;
    				in[u]++;in[v]++;
    				if(u==v){
    					loop++;
    					continue;
    				}
    				siz[u]++;siz[v]++;
    				f1=find(u);f2=find(v);
    				if(f1!=f2) fa[f2]=f1;
    			}
    			
    			int ca=find(1);
    			for(int i=1;i<=n;i++){
    				if(in[i]>0){
    					ca=find(i);
    					break;
    				}
    			}
    			boolean flag=false;
    			for(int i=1;i<=n;i++){
    				if(ca!=find(i)&&in[i]>0){
    					flag=true;
    					break;
    				}
    			}
    			long ans=0;
    			if(!flag)
    			for(int i=0;i<m;i++){
    				u=a[i].from;v=a[i].to;
    				if(u!=v){
    					ans+=siz[u]+siz[v]-2+loop;
    				}else{
    					ans+=m-1;
    				}
    			}
    			System.out.println(ans/2);
    		}
    	}
    }
    
    
  • 相关阅读:
    【笔记】【dp模型】
    【刷题】【dp】【背包】金明的预算
    建模结束了——5.3
    HDU
    洛谷 P2734 [USACO3.3]游戏 A Game
    洛谷 P4095 [HEOI2013]Eden 的新背包问题
    洛谷 P1156 垃圾陷阱
    洛谷 P1833 樱花
    洛谷 P3966 [TJOI2013]单词
    洛谷 P5357 【模板】AC自动机(二次加强版)
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/6796517.html
Copyright © 2020-2023  润新知