Codeforces Round #407 (Div. 2)-D. Weird journey

来源:互联网 发布:排序java 编辑:程序博客网 时间:2024/05/19 14:54

题目连接 http://codeforces.com/contest/789
开始以为是一笔画问题,突然想起来以前想写一笔画问题没有写,给定 m,n,然后n是边的个数,要求从一个点开始,经历(n-2)条边两次。经历两条边一次。计算连通度即可。注意区分自环

#include <bits/stdc++.h>using namespace std;const int maxn=1000090;vector<int>G[maxn];int vis[maxn];void add(int u,int v){   G[u].push_back(v);    G[v].push_back(u);}bool dfs(int a){   if(vis[a]) return false;  vis[a]=true;   for(int i=0;i<G[a].size();i++)   {   int s=G[a][i];       dfs(s);   }    return true;}int main(){    int m,n;     int a,b;     long long  du[maxn];     long long cnt,cnt2;     long long dd[maxn];     cin>>m>>n;     memset(vis,0,sizeof(vis));     memset(du,0,sizeof(du));     memset(dd,0,sizeof(dd));     cnt=0;     cnt2=0;     for(int i=1;i<=n;i++)     {      scanf("%d%d",&a,&b);         add(a,b);         add(b,a);         if(a!=b)            {   du[a]++;               du[b]++;                cnt++;                }         else         {  dd[a]+=2;            cnt2++;         }     }     dfs(a);     for(int i=1;i<=m;i++)        if(!vis[i]&&(du[i]>0||dd[i]>0))        {  printf("0\n");            return 0;//如果没有            //cout<<"no"<<endl;        //break;        }     long long ans=0;      ans+=cnt*cnt2;      ans+=cnt2*(cnt2-1)/2;      for(int i=1;i<=m;i++)      {  ans+=du[i]*(du[i]-1)/2;      }     cout<<ans<<endl;      return 0;}
0 0
原创粉丝点击