杭電 3018
father[fa]=fb,寫成father[a]=fb;
難受,是真的難受
弄錯了,搞了我幾個小時,還是對并查集不熟悉 呀,時刻告誡自己心態不要崩。
考察點: 一筆畫 問題 對于 全是偶度點的連通圖可以 一筆畫
對于 存在N個奇度點的連通圖可以 畫 N/2 筆
孤立點不算
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
using namespace std;
int father[100005],du[100005];
int ji[100005];
bool vis[100005];
//尋找父親節點
int findf(int x)
{
if(x!=father[x])
{
father[x]=findf(father[x]);
}
return father[x];
}
int main()
{
int n,m,fa,fb,i;
int ans=0;
int a,b;
int fat;
vector<int>ff;
int vv;
while(scanf("%d%d",&n,&m)!=EOF)
{
ff.clear();
ans=0;
for(i=1;i<=n;i++)
{
vis[i]=false;
du[i]=0;
ji[i]=0;
father[i]=i;
}
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
du[a]++;
du[b]++;
fa=findf(a);
fb=findf(b);
if(fa!=fb)
{
father[fa]=fb;
}
}
for(i=1;i<=n;i++)
{
fat=findf(i);
if(!vis[fat])
{
vis[fat]=true;
ff.push_back(fat);
}
if(du[i]&1)
{
ji[fat]++;
}
}
for(i=0;i<ff.size();i++)
{ vv=ff[i];
if(du[vv]==0)
continue;
if(ji[vv]==0)
ans++;
else
{
ans+=(ji[vv]/2);
}
}
printf("%d\n",ans);
}
return 0;
}
杭電 3018
一個無向圖 每個點至少與其他一半的點存在邊,我剛開始沒有判斷沒有哈密頓回路的情況,也是對的,應該題目的情況肯定存在哈密頓回路吧。
#include<bits/stdc++.h>
using namespace std;
int mapp[151][151];
bool vis[151];
int rd[151];
int n,m;
int cnt=0;
bool flag=false;
void dfs(int x,int num)
{
rd[num]=x;
vis[x]=true;
if(num==(n))
{
if(mapp[1][x])
flag=true;
return;
}
for(int i=1;!flag&&i<=n;i++)
{
if(mapp[x][i]&&!vis[i]&&!flag)
{
dfs(i,num+1);
vis[i]=false;
}
}
return;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
cnt=0;
memset(mapp,0,sizeof(mapp));
memset(vis,false,sizeof(vis));
flag=false;
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
mapp[a][b]=1;
mapp[b][a]=1;
}
dfs(1,1);
if(flag)
{
for(int i=1;i<n;i++)
{
printf("%d ",rd[i]);
}
printf("%d\n",rd[n]);
}
else
{
printf("no solution\n");
}
}
return 0;
}