Cod sursa(job #1228811)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 15 septembrie 2014 16:45:07
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

int n;

char c[3000];

int main()
{
    int sol[260][260][2],nrd[260][260][2];
    freopen("rf.in","r",stdin);
    freopen("rf.out","w",stdout);

    scanf("%d\n",&n);
    for (int i=1;i<=n;++i)
    {
        gets(c); c[strlen(c)+1]='\0'; c[strlen(c)]=' ';
        int z=0;
        for (int j=1;j<=n;++j)
        {
            while (c[z]!=' ')
            {
                sol[i][j][0]=sol[i][j][0]*10+(c[z]-'0');
                ++z;
            }
            while (c[z]==' ') ++z;
            if (sol[i][j][0]!=0) nrd[i][j][0]=1;
        }
    }

    for (int k=1;k<=n;++k)
    {
        char pas1,pas2;
        pas1=k&1;
        pas2=(k+1)&1;
        for (int i=1;i<=n;++i)
        {
            for (int j=1;j<i;++j)
            {
                sol[i][j][pas1]=sol[i][j][pas2]; nrd[i][j][pas1]=nrd[i][j][pas2];
                int val=sol[i][k][pas2]+sol[k][j][pas2],val2=nrd[i][k][pas2]+nrd[k][j][pas2];
                        if (val<sol[i][j][pas1])
                        {
                            sol[i][j][pas1]=val; nrd[i][j][pas1]=val2;
                        }else if (val==sol[i][j][pas1] && val2>nrd[i][j][pas1]) nrd[i][j][pas1]=val2;
                sol[j][i][pas1]=sol[i][j][pas1]; nrd[j][i][pas1]=nrd[i][j][pas1];
            }
        }
    }

    int pas=n%2;

    for (int i=1;i<=n;++i)
    {
        for (int j=1;j<=n;++j)
        {
            printf("%d ",sol[i][j][pas]);
        }
        printf("\n");
    }

    for (int i=1;i<=n;++i)
    {
        for (int j=1;j<=n;++j)
        {
            printf("%d ",nrd[i][j][pas]);
        }
        printf("\n");
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}