Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #define EPS (0.0000001)
- #define N (1004)
- #define OUT_N (11)
- typedef struct rect{
- double data;
- int ind;
- }rect_t;
- rect_t W[N][OUT_N];
- int in_v[N], out_v[N];
- int IND[N];
- double vec[N][N / 2 + 4];
- int vecIndToW[N];
- int n, m;
- /*
- void PrintM(FILE *out){
- for(int i = 0; i < n; i++){
- for(int j = 0; j <= n / 2 + 2; j++){
- fprintf(out, "%lf ", vec[i][j]);
- }
- fprintf(out, "\n");
- }
- fprintf(out,"\n");
- fflush(out);
- }
- void PrintMIND(FILE *out, int mk){
- for(int i = 0; i < mk; i++){
- for(int j = 0; j <= n; j++)
- fprintf(out, "%lf ", vec[IND[i]][j]);
- fprintf(out, "\n");
- }
- fprintf(out, "\n");
- fflush(out);
- }
- */
- double getW(int a, int b){
- for(int i = 0; i < OUT_N; i++){
- if(W[a][i].ind == b)
- return W[a][i].data;
- }
- return 0;
- }
- int changeW(int a, int b, double c){
- for(int i = 0; i < OUT_N; i++){
- if(W[a][i].ind == b) {
- W[a][i].data = c;
- return 0;
- }
- }
- return 1;
- }
- void newW(int a, int b, double c){
- for(int i = 0; i < OUT_N; i++)
- if((W[a][i].data == 0) && (W[a][i].ind == 0)){
- W[a][i].data = c;
- W[a][i].ind = (int)b;
- return;
- }
- }
- int main() {
- FILE *in = fopen("input.txt", "r"), *out = fopen("output.txt", "w");
- fscanf(in, "%i %i", &n, &m);
- for(int i = 0; i < m; i++){
- int a, b;
- double w;
- fscanf(in, "%i %i %lf", &a, &b, &w);
- newW(a, b, w);
- }
- for(int i = 0; i < n; i++){
- for(int j =0; j < n; j++){
- if(getW(i, j)){
- out_v[i]++;
- in_v[j]++;
- }
- }
- }
- while(!feof(in)){
- int a;
- double d;
- fscanf(in, "%i %lf", &a, &d);
- if(out_v[a] == 0) d *= -1;
- vec[a][n / 2 + 2] = d;
- }
- int vecI = 0;
- for(int i = 0; i < n; ++i){
- if(in_v[i] == 0){
- vec[vecI][vecI] = 1;
- vecIndToW[vecI] = i;
- vecI++;
- continue;
- }
- }
- int in_k = 0, out_k = 0;
- for (int i = 0; i < n; ++i) {
- if(in_v[i] == 0)
- in_k++;
- if(out_v[i] == 0)
- out_k++;
- }
- if(out_k < in_k){
- fprintf(out, "INFINITY!");
- fclose(in);
- fclose(out);
- return 0;
- }
- for (int k = 0; k < n; ++k) {
- for (int i = 0; i < n; i++) {
- if (in_v[i] != 0) continue;
- for (int j = 0; j < n; j++) {
- double g = getW(i, j);
- if (g == 0) continue;
- for(int p = 0; p <= (n / 2) + 2; p++) {
- vec[j][p] += vec[i][p] * g;
- }
- changeW(i, j, 0);
- --in_v[j];
- }
- }
- }
- int k = 0;
- for (int i = 0; i < n; ++i) {
- if(out_v[i]) continue;
- IND[k++] = i;
- }
- int mk = k;
- for(int i = 0; i < in_k; i++){
- int max = i;
- for(int j = i + 1; j < mk; j++){
- if(fabsf(vec[IND[j]][i]) > fabsf(vec[IND[max]][i]))
- max = j;
- }
- int t = IND[i];
- IND[i] = IND[max];
- IND[max] = t;
- if(fabs(vec[IND[i]][i] < EPS)){
- fprintf(out, "INFINITY!");
- fclose(in);
- fclose(out);
- return 0;
- }
- for (int j = i + 1; j < mk; ++j) {
- double k = vec[IND[i]][i] / vec[IND[j]][i];
- for(int p = i; p <= n; ++p){
- vec[IND[j]][p] -= vec[IND[i]][p] / k;
- }
- }
- }
- fprintf(out, "SOLUTION:\n");
- for(int i = mk - 1; i >= 0; i--){ //колво уравнений может быть больше
- if(!vec[IND[i]][i]) continue;
- vec[IND[i]][n / 2 + 2] /= vec[IND[i]][i];
- vec[IND[i]][i] = 1;
- fprintf(out, "%i %0.5f\n", vecIndToW[i], fabsf(vec[IND[i]][n / 2 + 2]));
- for (int j = i - 1; j >= 0 ; --j) {
- vec[IND[j]][n / 2 + 2] -= vec[IND[j]][i] * vec[IND[i]][n / 2 + 2];
- }
- }
- fflush(stdout);
- fclose(in);
- fclose(out);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement