UVA - 12263 Rankings 模拟(拓扑排序)

  1 #pragma comment(linker, "/STACK:1000000000")
  2 #include <bits/stdc++.h>
  3 #define LL long long
  4 #define INF 0x3f3f3f3f
  5 #define IN freopen("E.in","r",stdin);
  6 #define OUT freopen("out.txt", "w", stdout);
  7 using namespace std;
  8 #define MAXN 505
  9 #define MAXM 25005
 10 int s[MAXM], t[MAXM];
 11 int a[MAXN], b[MAXN], pos[MAXN], c[MAXN];
 12 bool dayu[MAXN][MAXN], res[MAXN][MAXN], u[MAXN][MAXN];
 13 bool vis[MAXN];
 14 int main()
 15 {
 16     int T;
 17     scanf("%d", &T);
 18     int cas = 1;
 19     while(T--){
 20         cas++;
 21         int n;
 22         scanf("%d", &n);
 23         for(int i = 1; i <= n; i++){
 24             scanf("%d", &a[i]);
 25         }
 26         memset(dayu, 0, sizeof(dayu));
 27         memset(vis, 0, sizeof(vis));
 28         memset(b, 0, sizeof(b));
 29         for(int i = 1; i <= n; i++){
 30             for(int j = i + 1; j <= n; j++){
 31                 dayu[a[i]][a[j]] = true;
 32             }
 33         }
 34         int m;
 35         scanf("%d", &m);
 36         memset(u, 0, sizeof(u));
 37         for(int i = 1; i <= m; i++){
 38             scanf("%d%d", &s[i], &t[i]);
 39             if(u[s[i]][t[i]]) continue;
 40             u[s[i]][t[i]] = true;
 41             dayu[s[i]][t[i]] = !dayu[s[i]][t[i]];
 42             dayu[t[i]][s[i]] = !dayu[t[i]][s[i]];
 43         }
 44         int x, y;
 45         int p = 0;
 46         bool noans = false;
 47         for(int i = 1; i <= m; i++){
 48             if(dayu[s[i]][t[i]]){
 49                 x = t[i];
 50                 y = s[i];
 51             }else{
 52                 x = s[i];
 53                 y = t[i];
 54             }
 55             if(!vis[x]){
 56                 vis[x] = true;
 57                 int j = p;
 58                 if(p == 0){
 59                     b[++p] = x;
 60                 }
 61                 else{
 62                     while(j >= 0 && dayu[x][b[j]]){
 63                         j--;
 64                     }
 65                     for(int k = p; k > j; k--){
 66                         pos[b[k]]++;
 67                         b[k + 1] = b[k];
 68                     }
 69                     b[j + 1] = x;
 70                     p++;
 71                 }
 72                 pos[x] = j + 1;
 73             }
 74             if(!vis[y]){
 75                 vis[y] = true;
 76                 int j = pos[x] - 1;
 77                 while(j >= 0 && dayu[y][b[j]]){
 78                     j--;
 79                 }
 80                 for(int k = p; k > j; k--){
 81                     pos[b[k]]++;
 82                     b[k + 1] = b[k];
 83                 }
 84                 p++;
 85                 b[j + 1] = y;
 86                 pos[y] = j + 1;
 87             }
 88         }
 89         int j = 1;
 90         memset(pos, 0, sizeof(pos));
 91         for(int i = 1; i <= n; i++){
 92             if(vis[a[i]]){
 93                 c[i] = b[j++];
 94             }
 95             else{
 96                 if(dayu[a[i]][b[j]] || j > p){
 97                     c[i] = a[i];
 98                 }
 99                 else{
100                     c[i] = b[j++];
101                 }
102             }
103             pos[c[i]] = i;
104         }
105         memset(res, 0, sizeof(res));
106         for(int i = 1; i <= n; i++){
107             for(int j = i + 1; j <= n; j++){
108                 res[c[i]][c[j]] = true;
109             }
110         }
111         for(int i = 1; i <= n; i++){
112             for(int j = 1; j <= n; j++){
113                 if(res[i][j] != dayu[i][j]){
114                     noans = true;
115                     break;
116                 }
117             }
118             if(noans){
119                 break;
120             }
121         }
122         if(noans){
123             printf("IMPOSSIBLE\n");
124             continue;
125         }
126         for(int i = 1; i < n; i++){
127             printf("%d ", c[i]);
128         }
129         printf("%d\n", c[n]);
130     }
131     return 0;
132 }
时间: 2024-10-10 04:33:15

UVA - 12263 Rankings 模拟(拓扑排序)的相关文章

UVa 10305 - Ordering Tasks 拓扑排序题解

Topological Sort题解.本题是简单的入门题目. Topological Sort的思想很简单,就是按没有入度的点,先输出,然后删除这个点的出度.然后输出下一组没有入度的点. 如何实现也是很简单的: 这里使用邻接表,建图的时候反过来建图,建立一个入度邻接表. 然后使用一个vis数组,记录访问过的节点,也可以根据这个信息知道哪些是已经输出的点,这个时候这些点的入度可以不算为当前入度了. #include <stdio.h> #include <vector> using

UVA 1572 Self-Assembly(拓扑排序)

1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面. 2 // 在图论中,这个问题称为拓扑排序.(toposort) 3 // 不难发现:如果图中存在有向环,则不存在拓扑排序,反之则存在. 4 // 不包含有向环的有向图称为有向无环图(DAG). 5 // 可以借助DFS完成拓扑排序:在访问完一个结点之后把它加到当前拓扑序的首部. 6 7 int c[maxn]; 8 int topo[maxn],t; 9 bool dfs(int u) 10 { 11 c[u]

uva 10305 Ordering Tasks(拓扑排序)

拓扑排序,不用判断是否有环,dfs挺简单的 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> int map[105][105]; int visit[105]; int c[105]; int n,m,t; void dfs(int x) { visit[x] = 1; for(int i=1; i<=n; i++) { if(!visit[i]&&map[i][x]==1)

UVa 10305 - Ordering Tasks (拓扑排序裸题)

John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have already been executed. Input The input will consist of several instances of the problem. Each instance begins with

UVA 1423 Guess 【拓扑排序】

题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=36239 题意:给你序列的区间和的正负,要求构造一组序列满足条件. 转换为前缀和,进行拓扑序列. 代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<queue> using names

UVA 10305- Ordering Tasks(经典拓扑排序)

Problem F Ordering Tasks Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have al

UVa 872 - Ordering 输出全拓扑排序

本题要求输出全部拓扑排序的序列. 还好本题的数据量不是很大,限制在26个大写英文字母,故此可以使用递归法输出. 这个递归输出全部解在Leetcode很多这样的题目的,不小心的话,还是很难调试的. 总体考了递归和拓扑排序,还有判断是否可以拓扑排序-就是是否图有环. 考了三大知识点,难度还是有的.因为数据量不大,故此判断环可以使用一般递归方法,递归只需要注意细节就好了. #include <stdio.h> #include <vector> #include <string.h

UVA - 10305 - Ordering Tasks (拓扑排序!)

UVA - 10305 Ordering Tasks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem F Ordering Tasks Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n task

Day1:T1 模拟 T2 拓扑排序

T1:模拟 自己第一天的简直跟白痴一样啊...模拟都会打错.. 当时貌似在更新最大值的时候打逗比了... if((sum[x]==max && x<maxh) || sum[x]>max){  max=sum[x];  maxh=x; //现在(也就是9月+)再看,脑袋里只有sortsortsort,连最基本的更新最大指都忘了....智商唉.... 附上代码: #include<cstdio> #include<cstring> using namesp