1.1图的思维导图
1.2 图结构学习体会
main函数
输入v,e,k
建图CreateAdj( G,v,e )
输入n
while(n--)
set <int> E
flag=true
for i=1 to i<=v
输入color[i],并且E.insert(color[i]),visit[i] = 0。
end
定义一个l=E.size()
若输入的颜色种类不等于k
cout<<No,continue。
do{
for( i=1, i<=v&&flag ; i++ )
若visit[i]==0 {
则调用Check( G,k,i );
break;}
}while( flag && i<=v );
若 flag ==1,则cout << "Yes"
否则 cout << "No"
Check函数
建立一个指针指向顶点v,令visit[v]=1,表示已经遍历过了。
while(p)
若color[p->adjvex]==color[v],则说明顶点相邻的点颜色相同
flag=false。
若!visit[p->adjvex],则递归搜索。
p=p->nextarc
end
建立一个队列queue <int> q,用来解决层数问题。
遍历过的x,令visit[x]=1,并将x入队q
定义lengh=1来表示层数,last=x保存每一层最后一个顶点,count=1计数人数。
while(!q.empty())
定义v=q.front(),定义一个指针p指向v
遍历该层所有顶点,若该点未遍历则count++,若lengh<6层,则将该点入队。
若last==v,则lengh++,并且last=q.back()
end
输出x,100.0*count/G->n。
这题的基本思路就是利用prim算法构建最小生成树。
匈牙利算法
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,ans;
int match[210];//母牛i的配偶是公牛match[i]
bool chw[210];//在此趟询问中,母牛i是否被询问过
bool mp[210][210];//公牛i与母牛j是否有关系
bool find_ans(int x)
{
for(int i=1;i<=m;i++)
{
if(mp[x][i]==true&&chw[i]==true)
{
chw[i]=false;
if(match[i]==0||find_ans(match[i])==true)
//母牛没有配偶||匹配该母牛的公牛能否换一头母牛匹配
{
match[i]=x;
return true;
}
}
}
return false;
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(mp,false,sizeof(mp));
for(int i=1;i<=n;i++)
{
int k,x;
scanf("%d",&k);
for(int j=1;j<=k;j++)
{
scanf("%d",&x);
mp[i][x]=true;
}
}
ans=0;
memset(match,0,sizeof(match));
for(int i=1;i<=n;i++)
{
memset(chw,true,sizeof(chw));
if(find_ans(i)==true) ans++;
}
printf("%d\n",ans);
}
return 0;
}
原文:https://www.cnblogs.com/oracler0103/p/9192226.html