Cod sursa(job #1850049)

Utilizator alexionpopescuPopescu Ion Alexandru alexionpopescu Data 18 ianuarie 2017 09:20:31
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include<vector>
#include<queue>
#define pp pair<int,int>
#define inf 99999
#include<string.h>
using namespace std;
ifstream fin("royfloyd.in");
ofstream fout("royfloyd.out");
vector<pp> a[101];
priority_queue<pp,vector<pp>,greater<pp> > q;
int d[10001],n,m;
void cit(){
    int i,j,h,w;
    fin>>n;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            fin>>w;
            if(w!=0)
                a[i].push_back(pp(j,w));
    }
    fin.close();
}
void dijkstra(int r){
    pp p;
    int i,k,x,y;
    for(i=1;i<=n;i++)
        if(i!=r)
            d[i]=inf;
    q.push(make_pair(0,r));
    while(!q.empty()){
        p=q.top();
        q.pop();
        k=p.second;
        if(d[k]!=p.first)
            continue;
        for(i=0;i<a[k].size();i++){
            x=a[k][i].first;
            y=a[k][i].second;
            if(d[x]>d[k]+y){
                d[x]=d[k]+y;
                q.push(make_pair(d[x],x));
            }
        }
    }
}
int main(){
    cit();
    int i,j;
    for(i=1;i<=n;i++){
        dijkstra(i);
        for(j=1;j<=n;j++)
            if(j!=i){
                if(d[j]==inf)
                    fout<<0<<" ";
                else
                    fout<<d[j]<<" ";
            }
            else
                fout<<0<<" ";
        fout<<'\n';
        memset(d,0,sizeof(d));
    }
    fout.close();
    return 0;
}