
int main()
{
    CreateMGraph();//建图
   
    for i=0 to N
        flag=1;colornum=0;//颜色数量
        for j=0 to n
            输入颜色;颜色数组存储颜色
            int Flag=0;
            for k=0 to k<j
                if 颜色数组中存在与当前颜色相同的,则判断错误,即Flag=1
            if 颜色正确
                颜色数量加一
        if 颜色数量不为K,判断为错误,即flag=0
        if 颜色数量正确
            for j=0 to n
                for k=0 to n 
                    judge(j);//进入函数判断配色方案是否正确
                    if flag==0
                        break;//停止循环
        if flag==1 输出 Yes
        else 输出 No
}
void judge(int p)
{
    if p遍历过 或 此时flag为0,则不再进行任何操作
    else
        标记p遍历过
        for i=0 to n
            if p与i有关联,即edges[p][i]==1
                if p处颜色与i处颜色相同
                    flag=0 并且停止循环
                else if i未遍历过
                    i进入函数judge进行递归
}




/*由普里姆算法改造*/
int prime(int n)
{
        cost[1]=0;   //初始化
        for i=2 to n   
            cost[i]=road[1][i];
        for i=1 to n
            min初始为一个极大值
            for j=1 to n
                if 通往j的费用不为0 且 小于 min
                    min=cost[j];k=j;
            if k!= 0
                num=cost[k]+num;//记录最小费用
                cost[k]=0;   // 作为记录过的标志
                for j=1 to n
                    if j未访问过 且 k到j的费用小于当前j的费用
                        cost[j]=coad[k][j];
                else
                    输出 -1;flag=1;退出结束循环
        if flag==0
            输出最低成本
}




/*该道题主要运用狄克斯特拉算法*/
void Dijkstra(int n,int c1,int c2)
{
    for i=0 to n   //初始化
        cost[i]=fare[c1][i];
        dist[i]=city[c1][i];
    visited[c1]=1;dist[c1]=0;
    for i=0 to n      //找出距离c1最小的点
        mindis初始化为最大数值
        for j=0 to n
            if j点未访问过 且 j到c1的距离小于mindis
                k=j;
                mindis=dist[j];//更新最小距离
        for j=0 to n      //修改未访问过顶点的距离
            if j未访问过
                    if k到j的距离加上此时最小距离小于j到c1的距离,改变j的数值
                        dist[j]=dist[k]+city[k][j];
                        cost[j]=cost[k]+fare[k][j];
                    else if 距离相同 且 所用费用小于此时总费用
                        cost[j]=cost[k]+fare[k][j];
}




本次题目集总分:310分

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
typedef pair<int,int>pii;
const int N = 20;
const int mod = 765431;
int n=9;
char mp[N][N];  //  原图
char opt[N][N]; // 中间图
bool vol[N][N],row[N][N]; //row[i][j] 第i行中已经有j数字,vol[i][j]第i列中已经有j数字
pii P[100];int sz; // 存储所有的未知位置
int flag;
bool check(int now,int val){  // 查询 3*3宫
    pii p = P[now];
    int n=(p.first-1)/3*3;
    int m=(p.second-1)/3*3;
    for(int i=n+1;i<=n+3;i++){
        for(int j=m+1;j<=m+3;j++){
            if(opt[i][j] == val+‘0‘) return false;
        }
    }
    return true;
}
void dfs(int now){
    if(flag) return ;
    if(now==sz) {
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++) {
                if(j!=1) putchar(‘ ‘);
                printf("%c",opt[i][j]);
            }
            puts("") ;
        }
        flag=1;
        return ;
    }
    pii p = P[now];
    for(int j=1;j<=9;j++){
        if( !row[p.first][j] && !vol[p.second][j] && check(now,j)){
            row[p.first][j]=1; vol[p.second][j]=1;
            opt[p.first][p.second]=j+‘0‘;
            dfs(now+1);
            row[p.first][j]=0; vol[p.second][j]=0;
            opt[p.first][p.second]=mp[p.first][p.second];
        }
    }
}
int main(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%c",&mp[i][j]);
            opt[i][j]=mp[i][j];
            if(mp[i][j] == ‘*‘) {
                P[sz].first=i;
                P[sz++].second=j;
            }else {
                int val=mp[i][j]-‘0‘;
                vol[j][val]=1;
                row[i][val]=1;
            }
        }
        getchar();
    }
    flag=0;
    dfs(0);
    return 0 ;
}

博客指路→(https://blog.csdn.net/qq_37383726/article/details/79703157)
原文:https://www.cnblogs.com/wwwwxy128/p/9185079.html