题意:给你一个序列 , 给你一个mark 矩阵 , 如果mark[i][j] = 1, 则代表序列i j 可以交换,需要求出交换之后字典序最小的序列
题解:
floyd 处理一遍,然后靠前的优先选择最小的数 , 然后没了
代码:
#include<stdio.h>
#include<string.h>
#define N_node 305
int n, dis[N_node][N_node], value[N_node], dir[N_node], mark[N_node];
void floyd()
{
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][j] = dis[i][k] & dis[k][j];
}
int main()
{
int T, a;
char s1[305];
while(scanf("%d", &n) !=EOF )
{
memset(dis, 0, sizeof(dis));
for(int i = 0; i < n; i++)
{
scanf("%d", &a);
value[i] = a-1;
dir[value[i]] = i;
}
for(int i = 0; i < n; i++)
{
scanf("%s", s1);
for(int j = 0; j < n; j++)
{
dis[i][j] = s1[j] - ‘0‘;
}
}
floyd();
memset(mark, 0, sizeof(mark));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n ; j++)
{
if(dis[i][dir[j]])
{
mark[j] = 1;
dir[value[i]] = dir[j];
value[dir[j]] = value[i];
value[i] = j;
dir[j] = i;
// break;
}
}
// printf("%d = %d\n", i , value[i]+1);
}
printf("%d", value[0]+1);
for(int i = 1; i < n; i++)
printf(" %d", value[i]+1);
printf("\n");
}
}
Codeforces 500B - New Year Permutation(最短路)
原文:http://blog.csdn.net/q651111937/article/details/45949771