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);
		}
	}
}

posted @ 2017-05-02 15:59  江南何采莲  阅读(130)  评论(0编辑  收藏  举报