
谈谈你对图结构中的几个经典算法学习体会。具体有:
主函数中应用函数的代码:
for i=0 to i=顶点数,遍历每一个顶点
{
    for i=0 to i=顶点数 
        初始化visited[i]等于0,即每一个顶点都没有被访问过
    应用函数计算当前节点的六度结果BFS(i);
}
void BFS(int v):
定义  整型变量level 表示当前遍历的节点与该节点的距离,
    tail存储上一个距离的最后一个节点;
    last存储当前距离的最后一个节点,初始化为当前节点v;
    count表示所遍历的节点数量;
    x表示当前遍历的节点;
定义 队列 Q;
v进队列,并将v节点标记为已访问
while(队列Q不空){   
    x等于 队头元素;
    将队头元素出队;
    for i=0 to i 等于顶点数 ,共遍历所有顶点
    {   if (顶点i与x有联系,且顶点i未被访问)
        {   节点i进队
            标记i已访问;
            count数量加一;
            tail 等于 i;          
        }end if
    }end for
    if(当前顶点是上一距离的最后一个节点,即x等于last)
    {   更新当前距离的最后一个节点last等于tail;
        距离level加一;  
    }end if;
    if(距离等于6)
        跳出循环;
}
则count就是传参v距离不超过6的结点数;
例子:如下图节点关系

last初始化等于v;
v=1,进队
队不为空
x等于队头1
tail 依次等于 2,3
此时 x等于last等于1
所以  更新last等于tail等于3
x依次等于队头 2,3
所以tail依次等于 4,5   6,7
此时x等于last等于3
所以更新last等于7
就这样一层一层地遍历,统计每层的数量,直到第六层。
1.主函数

2.该题函数


错误:.段错误

题目要求的顶点范围是
,所以定义MAXV为10001,但是这样的话就会全部段错误

最后不用结构体,直接用全局数组,就可以通过了。

具体百度好像挺复杂的,注意到我们之前好像有讲过的一点,就是 结构体要求:结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。.不知道是不是因为这样,结构体所需内存比数组大,因而段错误。
主要思路
利用flag的值判断输出内容
判断主要有两个不符合条件:
1.颜色数量与题目要求不等
2.临点颜色不同
定义整型全局变量flag=1;
主函数(部分)
for i=0 to i=v 共v次进行判断{
    引用函数Judge(传参 图g)进行判断; 
    if(flag等于0)
         cout<<"No\n";
    否则
         cout<<"Yes\n";
    初始化flag 等于1
    }
Judge函数:
定义整型数组c[MAXV],d[MAXV]初始化为{0},分别表示需要判断的颜色们,和每种颜色出现的次数
整型变量 sum统计颜色数量
    for i=0 to i=n 共总顶点次
        将颜色存入数组c[]中
        d[c[i]]++统计该颜色出现的次数
        如果 d[c[i]等于1] 即颜色c[i]第一次出现
            颜色数sum++;
    end for
    如果(sum 不等于 题目要求颜色数量) 
        flag等于0
    否则
        for i=1 to i=n 遍历顶点i
            for j=i+1 to j=n 遍历剩下的顶点,判断与顶点i的关系
                如果(顶点i与顶点j有联系 且 i的颜色等于j的颜色)
                    flag=0;
                    return flag;
                end if
            end for(j)
        end  for(i)
    end 否则
        




错误1:.:段错误
最大范围设置为500,应该为501

错误2:.:运行超时
将边数作为顶点数进行循环遍历

1.建图
以关系代表数为权值以矩阵储存建图
2.找朋友函数(部分)
    int findfrind (int a,int b)找好朋友,以a为初始点,遍历树找有无端点b 
        深度遍历
        如果 有遍历到顶点x 等于 b
            return 1
3.主函数(部分)
    for i=0 to i=k共k次输入要判断的宾客
        输入 a,b
        如果 edges[a][b] 等于1
            a和b是好朋友
        如果 edges[a][b] 等于-1
            如果 findfrind(a,b)等于  1
                a和b是有共同好友的敌人
            否则
                a和b是纯敌人
        如果 findfrind(a,b)等于  1
            a和b通过共同好友成为好友
        否则
            a和b没有关系



一直处理不好朋友的朋友还是朋友的关系,所以一直卡在这个测试点

本次题目集总分:310分

2833 奇怪的梦境
题目描述 Description
Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息。屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下。可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮忙判断。
输入描述 Input Description
第一行,两个数N,M,表示有编号为1...N这N个按钮,屏幕上有M条信息。
接下来的M行,每行两个数ai,bi,表示bi按钮要在ai之后按下。所给信息可能有重复,保证ai≠bi。
输出描述 Output Description
若按钮能全部按下,则输出“o(∩_∩)o”。
若不能,第一行输出“T_T”,第二行输出因信息有矛盾而无法确认按下顺序的按钮的个数。输出不包括引号。
#include <bits/stdc++.h>
using namespace std ;
int n , m , cnt ;
int N = 10005 ;
int ind[N] ;    //入度 
int e[10001][10001] ;
stack<int> s ;
void topsort(){
    for ( int i = 1 ; i <= n ; i++ )
        if (!ind[i]) s.push(i) ;
    while (!s.empty()){
        int point = s.top() ;
        s.pop() ;
        for ( int i = 1 ; i <= n ; i++ ){
            if (e[point][i]){
                ind[i]-- ;
                if (!ind[i]) s.push(i) ;
            }
        }
    }
    for ( int i = 1 ; i <= n ; i++ )
        if (ind[i]) cnt++ ;
}
int main(){
    cin >> n >> m ;
    int t1 , t2 ;
    for ( int i = 1 ; i <= m ; i++ ){
        scanf ("%d%d" , &t1 , &t2) ;
        e[t1][t2] = 1 ;
        ind[t2]++ ;
    }
    topsort() ;
    if (cnt) printf("T_T\n%d" , cnt) ;
    else cout << "o(∩_∩)o" ;
    return 0 ;
}
原文:https://www.cnblogs.com/Zeng99/p/9175199.html