【算法】高斯消元&线性代数
寒假作业~就把文章和题解3道题的代码扔在这里啦——链接: https://pan.baidu.com/s/1kWkGnxd 密码: bhh9
1.HNOI2013游走
#include <bits/stdc++.h>
using namespace std;
#define maxn 600
#define db double
int n, m, degree[maxn];
db f[maxn][maxn], ans[maxn], fans;
bool dis[maxn][maxn]; struct edge
{
int x, y;
db ans;
}R[maxn * maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} bool cmp(edge a, edge b)
{
return a.ans > b.ans;
} void Gauss()
{
for(int i = ; i <= n; i ++)
{
int now = i, j = i;
for(int j = i + ; j <= n; j ++)
if(fabs(f[j][i]) > fabs(f[now][i])) now = j;
if(i != now)
{
for(int k = ; k <= n + ; k ++)
swap(f[i][k], f[now][k]);
}
for(int j = i + ; j <= n + ; j ++)
f[i][j] /= f[i][i];
for(int j = ; j <= n; j ++)
{
if(j == i) continue;
for(int k = i + ; k <= n + ; k ++)
f[j][k] -= f[j][i] * f[i][k];
}
}
} int main()
{
n = read(), m = read();
for(int i = ; i <= m; i ++)
{
int x = read(), y = read();
R[i].x = x, R[i].y = y;
degree[x] ++, degree[y] ++, dis[x][y] = dis[y][x] = true;
}
n -= ;
for(int i = ; i <= n; i ++)
for(int j = ; j <= n; j ++)
if(dis[i][j]) f[i][j] = - ( / (db) degree[j]);
else if(i == j) f[i][j] = ;
f[][n + ] = ;
Gauss();
for(int i = ; i <= n; i ++) ans[i] = f[i][n + ];
for(int i = ; i <= m; i ++)
R[i].ans = ((db) ans[R[i].x] / (db) degree[R[i].x]) + ((db) ans[R[i].y] / (db) degree[R[i].y]);
sort(R + , R + + m, cmp);
for(int i = ; i <= m; i ++)
fans += (db) i * R[i].ans;
printf("%.3lf\n", fans);
return ;
}
2.USACO灯
#include <bits/stdc++.h>
using namespace std;
#define maxn 60
int n, m, a[maxn][maxn], ans[maxn], fans = , tot; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Gauss()
{
for(int i = ; i <= n; i ++)
{
int now = i, j = i;
while(j <= m && !a[j][i]) j ++;
if(j > m) continue;
if(now != j)
{
for(int k = ; k <= n + ; k ++)
swap(a[now][k], a[j][k]);
}
for(int j = ; j <= n; j ++)
if(j != i && a[j][i])
{
for(int k = ; k <= n + ; k ++)
a[j][k] ^= a[i][k];
}
}
} void dfs(int now)
{
if(tot >= fans) return;
if(!now)
{
fans = min(fans, tot);
return;
}
if(a[now][now]) //不是自由元
{
int tem = a[now][n + ];
for(int i = now + ; i <= n; i ++)
if(a[now][i]) tem ^= ans[i];
ans[now] = tem;
if(tem) tot ++;
dfs(now - );
if(tem) tot --;
}
else
{
ans[now] = ;
dfs(now - );
tot ++;
ans[now] = ;
dfs(now - );
tot --;
}
} int main()
{
n = read(), m = read();
for(int i = ; i <= n; i ++)
a[i][i] = , a[i][n + ] = ;
for(int i = ; i <= m; i ++)
{
int x = read(), y = read();
a[x][y] = , a[y][x] = ;
}
Gauss();
dfs(n);
printf("%d", fans);
}
3.NOIP2004虫食算
#include <bits/stdc++.h>
using namespace std;
#define maxn 40
int n, f[maxn][maxn], g[maxn][maxn], d[maxn], x[maxn];
char s[][maxn];
bool vis[maxn], flag; int GCD(int x, int y)
{
int z;
while(y)
{
z = x % y;
x = y, y = z;
}
return x;
} int LCM(int x, int y)
{
return (x * y / GCD(x, y));
} void check()
{
memset(vis, , sizeof(vis));
for(int i = ; i <= n; i ++)
{
int sum = ;
for(int j = ; j <= n; j ++)
sum += d[j] * g[i][j];
if(sum % f[i][i]) return;
sum /= f[i][i];
if(sum < || sum >= n || vis[sum]) return;
vis[x[i] = sum] = true;
}
flag = true;
} void solve()
{
for(int p = ; p <= n; p ++)
{
int now = p;
for(int i = p + ; i <= n; i ++)
if(abs(f[i][p]) > abs(f[now][p])) now = i;
if(now != p)
{
for(int i = ; i <= n; i ++)
swap(f[now][i], f[p][i]), swap(g[now][i], g[p][i]);
}
for(int i = ; i <= n; i ++)
if(i != p && f[i][p])
{
int lcm = LCM(f[i][p], f[p][p]);
int d1 = lcm / f[i][p], d2 = lcm / f[p][p];
for(int j = ; j <= n; j ++)
{
f[i][j] = f[i][j] * d1 - f[p][j] * d2;
g[i][j] = g[i][j] * d1 - g[p][j] * d2;
}
}
}
} void dfs(int u)
{
if(u == )
{
check();
if(flag)
{
for(int i = ; i < n; i ++)
printf("%d ", x[i]);
printf("%d\n", x[n]);
exit();
}
return;
}
d[u] = , dfs(u - );
d[u] = , dfs(u - );
} int main()
{
scanf("%d", &n);
scanf("%s%s%s", s[] + , s[] + , s[] + );
for(int i = ; i <= n; i ++)
for(int j = ; j <= ; j ++)
if(j < ) f[i][s[j][i] - 'A' + ] += ;
else f[i][s[j][i] - 'A' + ] -= ;
for(int i = ; i <= n; i ++)
g[i][i] = n, g[i][i + ] = -;
solve();
dfs(n);
return ;
}
【算法】高斯消元&线性代数的更多相关文章
- AcWing 207. 球形空间产生器 (高斯消元)打卡
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体. 现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. ...
- 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)
A------------------------------------------------------------------------------------ 题目链接:http://20 ...
- 高斯消元初步(Gauss算法)
Gauss算法,称为高斯消元算法,用来解决n元一次方程,在解决线性方程问题起着重要作用. 简述 运用高斯消元的方法,我们可以在O(n3)的时间求出n元线性方程,但是由于时间复杂度的原因,请注意题目数据 ...
- P3265 [JLOI2015]装备购买(高斯消元+贪心,线性代数)
题意; 有n个装备,每个装备有m个属性,每件装备的价值为cost. 小哥,为了省钱,如果第j个装备的属性可以由其他准备组合而来.比如 每个装备属性表示为, b1, b2.......bm . 它可以由 ...
- 【CF736D】Permutations 线性代数+高斯消元
[CF736D]Permutations 题意:有一个未知长度为n的排列和m个条件,第i个条件$(a_i,b_i)$表示第$a_i$个位置上的数可以为$b_i$.保证最终合法的排列的个数是奇数.现在有 ...
- 【高斯消元】CDOJ1785 曜酱的线性代数课堂(三)
高斯消元求行列式板子. #include<cstdio> #include<cmath> #include<algorithm> #include<cstri ...
- 【高斯消元】CDOJ1784 曜酱的线性代数课堂(二)
高斯消元求矩阵秩板子. #include<cstdio> #include<cmath> #include<algorithm> #include<cstri ...
- 【高斯消元】CDOJ1783 曜酱的线性代数课堂(一)
高斯消元求逆矩阵板子. #include<cstdio> #include<cmath> #include<algorithm> #include<cstri ...
- 算法复习——高斯消元(ssoi)
题目: 题目描述 Tom 是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面.虽然他解决 2x=2 这样的方程游刃有余,但是对于下面这样的方程组就束手无策了.x+y=3x- ...
随机推荐
- Maven命令参数
命令参数 备注 mvn -v --version 显示版本信息; mvn -V --show-version 显示版本信息后继续执行Maven其他目标; mvn -h --help 显示帮助信息; m ...
- JS如何给ul下的所有li绑定点击事件,点击使其弹出下标和内容
这是一个非常常见的面试题,出题方式多样,但考察点相同,下面我们来看看这几种方法:方法一: var itemli = document.getElementsByTagName("li&quo ...
- C语言关于指针的注意事项
一.指针的四个关键概念1.指针的类型2.指针指向的类型3.指针的值,也就是指针指向的地址4.指针自己所占用的内存空间注意:指针变量所存的内容就是内存的地址编号! 例如:int **pp = NULL; ...
- queue消息队列
class queue.Queue(maxsize=0) #先入先出 class queue.LifoQueue(maxsize=0) #last in fisrt out class queue. ...
- Java+Selenium3方法篇24-单选和多选按钮操作
Java+Selenium3方法篇24-单选和多选按钮操作 本篇介绍 webdriver处理前端单选按钮的操作.单选按钮一般叫raido button,就像我们在电子版的单选答题过程一样,单选只能点击 ...
- "Mon Dec 31 00:00:00 CST 2012" java日期装换 "yyyy-MM-dd"
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import ja ...
- java 获取图片大小(尺寸)
1,获取本地图片大小(尺寸) File picture=new File(strSrc);BufferedImage sourceImg=ImageIO.read(new FileInputStrea ...
- 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(二):Apache安装和配置
基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django 基于Ubuntu Server 16.04 LTS版本安装和部署Djan ...
- [Hbase]hbase命令行基本操作
-进入hbase shell hbase shell - 帮助help help - 查看hbase versionversion - 查看hbase 状态 status - 创建表create 't ...
- MySQL高可用之MHA切换测试(switchover & failover)
Preface I've installed MasterHA yesterday,Now let's test the master-slave switch and failove ...