您的位置:首页 > 其它

Vijos 1966 夜夜的旅游计划 高斯消元

2016-11-08 14:42 399 查看
题目链接:https://vijos.org/p/1966

代码:

#include <bits/stdc++.h>
#define sf scanf
#define pf printf

using namespace std;
const int maxn = 200 + 5;
const double eps = 1e-7;
double adj[maxn][maxn];
typedef double Matrix[maxn][maxn];
Matrix A;
int ous[maxn];

void Gauss(Matrix A,int n){
int i,j,k,p;
//消元
for(i = j = 0;i < n && j < n;++j){
k = i;
for(p = i + 1;p < n;++p) if(fabs(A[p][j]) > fabs(A[k][j])) k = p;
if(k != i) for(p = 0;p <= n;++p) swap(A[i][p],A[k][p]);
for(k = 0;k < n;++k){
if(k != i && fabs(A[k][j]) > eps){
for(p = n;p >= j;--p){
A[k][p] = A[k][p] - A[i][p] / A[i][j] * A[k][j];
}
}
}
++i;
}
}
int main(){
int n,m;
sf("%d %d",&n,&m);
memset(A,0,sizeof A);
memset(adj,0,sizeof adj);
memset(ous,0,sizeof ous);
for(int i = 0;i < m;i++){
int u,v;double c;
sf("%d %d %lf",&u,&v,&c);u--,v--;
adj[u][v] = adj[v][u] = c;
ous[u]++,ous[v]++;
}
for(int i = 0;i < n - 1;++i){
for(int j = 0;j < n;++j){
if(fabs(adj[i][j]) > eps){
A[i][j] = 1.0;
A[i]
-= adj[i][j];
}
}
A[i][i] -= 1.0 * ous[i];
}
A[n - 1][n - 1] -= -1.0;
A[n - 1]
= 0;

Gauss(A,n);
pf("%.1f\n",A[0]
/ A[0][0] + eps);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: