触点数字孪生,揭秘它的独特魅力
640
2022-09-06
模板2
最小生成树(Prim,Kruskal)
求城市的最小生成树,城市标号是从0到n-1,注意重边和不能构成的情况
const int zui = 1000000000;int n,m;int map1[1010][1010];int lowdist[1010];int visit[1010];int sum;bool flag;void Prim(){ int i,j,k; sum = 0; memset(visit,0,sizeof(visit)); for(i=0; i<=n-1; i++) { lowdist[i] = map1[0][i]; } visit[0] = 1; for(i=1; i 求城市的最小生成树,修成的路用1标记,没有修成的用0标记 const int inf = 0x7f7f7f7f;//2139062143typedef long long ll;using namespace std;struct node{ int a,b; int value;}road[5000];int pre[110];bool cmp(node a,node b){ return a.value < b.value;}int find(int x){ return x == pre[x] ? x : pre[x] = find(pre[x]);}int Kruskal(int sum1){ int sum = 0; for(int i=0; i 最短路径 void Dijkstra(){ int i,j,k; int max2; memset(visit,0,sizeof(visit)); for(i=1; i<=n; i++) { low[i] = map1[0][i]; } for(i=1; i<=n; i++)//每次并一个点,需要并n次 { max2 = zui; for(j=1; j<=n; j++) { if(!visit[j] && low[j] < max2) { k = j; max2 = low[j]; } } visit[k] = 1; for(j=1; j<=n; j++) { if(!visit[j] && low[k] + map1[k][j] < low[j]) { low[j] = low[k] + map1[k][j]; } } }} void Floyed(){ int i,j,k; for(k=1; k<=n; k++) { for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { if(map1[i][j] > map1[i][k] + map1[k][j]) { map1[i][j] = map1[i][k] + map1[k][j]; } } } }} 二分图的最大匹配(最大匹配数=最大点覆盖) #include 记忆化搜索 AC代码1: dp[x][y]记录的是点(x,y)到点(n-1,n-1)的数量,dp[x][y]的数量可以由它所到达的点的dp[x][y]的和求出来 [cpp] view plain copy 1. #include AC代码2: [cpp] view plain copy 1. #include BFS 从起始位置到终止位置,转弯次数不超过k #include 连连看 线的转弯次数不超过2次 #include 路劲输出 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
}; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 Input 一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。 Output 左上角到右下角的最短路径,格式如样例所示。 Sample Input 0 1 0 0 00 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0 Sample Output (0, 0)(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4) int map1[5][5];int visit[30][30];int pre[30];struct node{ int x; int y;}a[30];int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};bool judge(int x,int y){ if(x >=0 && x < 5 && y >= 0 && y < 5 && !visit[x][y] && !map1[x][y]) return true; return false;}void print(int x){ int t = pre[x]; if(t == -1) { printf("(0, 0)\n"); return; } print(t); printf("(%d, %d)\n",a[x].x,a[x].y);}void bfs(){ int head = 0,tail = 1; a[0].x = 0; a[0].y = 0; pre[0] = -1; while(head < tail) { for(int i=0; i<4; i++) { int newx = a[head].x + dir[i][0]; int newy = a[head].y + dir[i][1]; if(a[head].x == 4 && a[head].y == 4) { print(head); return; } if(judge(newx,newy)) { visit[newx][newy] = 1; pre[tail] = head; a[tail].x = newx; a[tail].y = newy; tail++; } } head++; }}int main(){ for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { scanf("%d",&map1[i][j]); } } memset(visit,0,sizeof(visit)); bfs(); return 0;}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。