思路懂了,但是A了38个点(3个样例不算),WA了9个点,还没调出来
#include<bits/stdc++.h>
using namespace std;
#define maxn 200010
int head[maxn],idx=0;
struct edge{
int to,next;
}e[2*maxn];
void add(int u,int v)
{
e[++idx].to=v;
e[idx].next=head[u];
head[u]=idx;
}
int pie[maxn],cnt[maxn][2],cf[maxn],deg[maxn];
int cont=0,tot=0;
bool vis[maxn],color[maxn],fl[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m,u,v;
long long ans=0;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
add(u,v);//填边
add(v,u);
deg[u]++;deg[v]++;
}
queue<int>q;
for(int i=1;i<=n;i++)
if(!vis[i])
{
q.push(i);
color[i]=0;
vis[i]=1;
cnt[++cont][0]++;
while(!q.empty())
{
pie[q.front()]=cont;
for(int j=head[q.front()];j;j=e[j].next)
{
if(vis[e[j].to]&&color[e[j].to]==color[q.front()])
fl[cont]=1;
else if(!vis[e[j].to])
{
vis[e[j].to]=1;
color[e[j].to]=1^color[q.front()];
cnt[cont][1^color[q.front()]]++;
q.push(e[j].to);
}
}
q.pop();
}
}
for(int i=1;i<=cont;i++)//处理总共多少个为二分图的点
if(!fl[i])
tot+=(cnt[i][0]+cnt[i][1]);
for(int i=1;i<=cont;i++)
if(!fl[i])
cf[i]=tot-cnt[i][0]-cnt[i][1];//除开当前连通块其他连通块共多少点
// for(int i=1;i<=cont;i++)
// cout<<cf[i]<<" ";
// cout<<'\n';
for(int i=1;i<=cont;i++)
if(!fl[i])
ans+=(cnt[i][0]+cnt[i][1])*cf[i];
for(int i=1;i<=n;i++)
if(!fl[pie[i]])
ans+=(cnt[pie[i]][1^color[i]]-deg[i]);
cout<<ans/2;
return 0;
}