1、图着色问题
#include<bits/stdc++.h>
using namespace std;
const int N=510,M=N*N;
int color[N];
vector<int> g[M];
int v,m,k,n;void add(int a,int b){g[a].push_back(b);g[b].push_back(a);
}
int judge(int cnt){if(cnt!=k)return 0;for(int i=1;i<=v;i++){for(int j=0;j<g[i].size();j++){int t=g[i][j];if(color[i]==color[t])return 0;}}return 1;
}
int main(){cin>>v>>m>>k;while(m--){int a,b;cin>>a>>b;add(a,b),add(b,a);}cin>>n;for(int i=0;i<n;i++){set<int> se;//set具有去重功能for(int j=1;j<=v;j++){cin>>color[j];se.insert(color[j]);} if(judge(se.size()))cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}
2、地下迷宫探索
#include <bits/stdc++.h>
using namespace std;const int N = 1005;
int vis[N];
int g[N][N];
stack<int> stk;
int n, m, src;// 深度优先搜索函数
void dfs(int k) {vis[k] = 1;if (vis[src]) cout << k;else cout << " " << k;stk.push(k);for (int i = 1; i <= n; i++) {if (!vis[i] && g[k][i] == 1) {cout << " ";dfs(i);}}stk.pop();if(!stk.empty()){cout<<" "<<stk.top();}
}int main() {memset(vis, 0, sizeof(vis));cin >> n >> m >> src; // n代表节点数,m代表边数,src代表初末位置 int s, d;for (int i = 1; i <= m; i++) {cin >> s >> d;g[s][d] = g[d][s] = 1;}dfs(src);bool connected = true;for (int i = 1; i <= n; i++) {if (!vis[i]) {connected = false;break;}}if (!connected) cout << " " << 0;return 0;
}
3、寻宝图
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
int n,m,flag=0;
string map_m[N];
int cnt=0,cns=0;//cnt代表岛屿的数量,cns代表宝藏的数量
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void dfs(int x,int y){if(x<0||x>=n||y<0||y>=m||map_m[x][y]=='0')return;if(map_m[x][y]>'1'){flag=1; } map_m[x][y]='0';for(int i=0;i<4;i++){dfs(x+dx[i],y+dy[i]);}
}
int main(){cin>>n>>m;for(int i=0;i<n;i++)cin>>map_m[i];for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(map_m[i][j]>'0'){cnt++;flag=0;dfs(i,j);//查看是否有宝藏 if(flag)cns++;}}}cout<<cnt<<" "<<cns;return 0;
}
4、求采用邻接矩阵作为存储结构的无向图各顶点的度
#include <stdio.h>
#define MVNum 100 //最大顶点数
typedef struct{ char vexs[MVNum]; //存放顶点的一维数组 int arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和边数
}MGraph;
void degree(MGraph G);
void CreatMGraph(MGraph *G);/* 创建图 */
int main()
{MGraph G;CreatMGraph(&G);degree(G);return 0;
}
void CreatMGraph(MGraph *G)
{int i,j,k;scanf("%d%d",&G->vexnum,&G->arcnum);getchar();for(i=0;i<G->vexnum;i++)scanf("%c",&G->vexs[i]);for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++)G->arcs[i][j]=0;for(k=0;k<G->arcnum;k++){ scanf("%d%d",&i,&j); G->arcs[i][j]=1; G->arcs[j][i]=1; }
}/* 请在这里填写答案 */
void degree(MGraph G){int i,j;for(i=0;i<G.vexnum;i++){int cnt=0;for(j=0;j<G.vexnum;j++){if(G.arcs[i][j]==1)cnt++;}printf("%c:%d\n",G.vexs[i],cnt);}
}
5、采用邻接表创建无向图
#include <stdio.h>
#include <stdlib.h>
#define MVNum 100
typedef struct ArcNode{int adjvex; struct ArcNode *nextarc; int info;
}ArcNode; typedef struct VNode{ char data; ArcNode *firstarc;
}VNode, AdjList[MVNum]; typedef struct{ VNode vertices[MVNum]; int vexnum, arcnum;
}ALGraph;void CreateUDG(ALGraph &G);int main(){ALGraph G; int i , j,sum=0;CreateUDG(G);ArcNode * p; for(i = 0 ; i < G.vexnum ; ++i){sum=0;p=G.vertices[i].firstarc;for(; p!=NULL; p=p->nextarc){sum+=1;}if(i==0)printf("%d",sum);elseprintf(" %d",sum);}return 0;
}/* 请在这里填写答案 */
void CreateUDG(ALGraph &G) {int i, j, k;char v1, v2;// 输入顶点数和边数scanf("%d %d", &G.vexnum, &G.arcnum);getchar(); // 消耗掉输入缓冲区中的换行符// 输入顶点信息并初始化邻接表for (i = 0; i < G.vexnum; ++i) {scanf("%c", &G.vertices[i].data);G.vertices[i].firstarc = NULL;getchar(); // 消耗掉每个顶点后的换行符}// 输入边信息并构建邻接表for (k = 0; k < G.arcnum; ++k) {scanf("%c %c", &v1, &v2);getchar(); // 消耗掉每条边后的换行符// 查找顶点 v1 和 v2 的位置 i 和 jfor (i = 0; i < G.vexnum; ++i)if (G.vertices[i].data == v1) break;for (j = 0; j < G.vexnum; ++j)if (G.vertices[j].data == v2) break;// 构建依附于顶点 i 的边结点并插入链表头部ArcNode *pi = (ArcNode *)malloc(sizeof(ArcNode));pi->adjvex = j;pi->nextarc = G.vertices[i].firstarc;G.vertices[i].firstarc = pi;// 构建依附于顶点 j 的边结点并插入链表头部ArcNode *pj = (ArcNode *)malloc(sizeof(ArcNode));pj->adjvex = i;pj->nextarc = G.vertices[j].firstarc;G.vertices[j].firstarc = pj;}
}