B - New Year Permutation

来源:互联网 发布:wifi局域网劫持软件 编辑:程序博客网 时间:2024/04/30 13:15
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>


using namespace std;


#define MAXN 333
#define INF 1111111


struct node
{
    int val, id;
    bool operator <(const node &b) const
    {
        if(val != b.val)
            return val > b.val;
        return id > b.id;
    }


};


priority_queue<node> que;
int ans[MAXN], n;
int dis[MAXN][MAXN];


void fan()
{
    for( int k = 0; k < n; k++)
    {
        for( int i = 0; i < n; i++)
        {
            for( int j = 0; j < n; j++)
            {
                if(dis[i][j] > dis[i][k] + dis[k][j])
                    dis[i][j] = dis[i][k] + dis[k][j];


            }
        }
    }
}
int main()
{


    while(scanf("%d",&n) != EOF)
    {
        memset(ans, -1, sizeof(ans));
        if(!que.empty())
            que.pop();
        node temp;
        for( int i = 0; i < n; i++)
        {
            scanf("%d",&temp.val);
            temp.id = i;
            que.push(temp);
        }
        char a;
        for( int i = 0; i < n; i++)
        {
            getchar();
            for( int j = 0; j < n; j++)
            {
                scanf("%c",&a);
                dis[i][j] = a - '0';
                if(dis[i][j] == 0 && i != j)
                    dis[i][j] = INF;
            }
        }


        fan();
        int x = 0;
        int head;
        while(que.size())
        {
            temp = que.top();
            que.pop();
            head = x;
            //printf("-----%d---%d----",temp.id, x);
            //printf("%d\n", dis[temp.id][x]);
            while(dis[temp.id][x] == INF || ans[x] != -1)
                x++;
            ans[x++] = temp.val;
            x = (x == head+1? x : head);
        }
        for( int i = 0; i < n; i++)
            printf("%d%c",ans[i], i == n -1 ? '\n' :' ');
    }


}

0 0
原创粉丝点击