Cod sursa(job #2311843)

Utilizator Username01Name Surname Username01 Data 3 ianuarie 2019 19:05:23
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <bitset>
#include <deque>

using namespace std;
FILE *fin,*fout;

int start[102],t[3][10002],d[102][102],drum[102];
bool viz[102];
int n;
deque <int>q;
void bell(int no)
{
    int nod,p;
    for(int i=1;i<=n;++i)
        drum[i]=2000000000;
    q.push_back(no);
    viz[no]=1;
    drum[no]=0;
    while(!q.empty())
    {
        nod=q.front();
        q.pop_front();
        viz[nod]=0;
        p=start[nod];
        while(p)
        {
            if(drum[t[0][p]]>drum[nod]+t[2][p])
            {
                drum[t[0][p]]=drum[nod]+t[2][p];
                if(viz[t[0][p]]==0)
                {
                     q.push_back(t[0][p]);
                     viz[t[0][p]]=1;
                }
            }
            p=t[1][p];
        }
    }
    for(int i=1;i<=n;++i)
        d[no][i]=min(d[no][i],drum[i]);
}
int main()
{
    int k=0,x;
    fin=fopen("royfloyd.in","r");
    fout=fopen("royfloyd.out","w");
    fscanf(fin,"%d",&n);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
        {
            fscanf(fin,"%d",&x);
            if(x)
            {
                ++k;
                t[0][k]=j;
                t[1][k]=start[i];
                start[i]=k;
                t[2][k]=x;
            }
        }
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            d[i][j]=2000000000;
    for(int i=1;i<=n;++i)
        bell(i);
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
            fprintf(fout,"%d ",d[i][j]);
        fprintf(fout,"\n");
    }
    return 0;
}