CF 274D Lovely Matrix(拓撲排序)
轉載請註明出處,謝謝http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
題目:給出一個n*m的矩陣,問是否 能改變列的順序,使得每一行都非遞減(其中-1表示可以作為任何一個數)
由於範圍比較大,雖然是比較明顯的拓撲排序,但是建圖比較麻煩
不可能兩兩比較然後建圖,而且可能出現大量的相同的數字
做法是加入冗餘結點,對於每一行我們來建圖,排序之後,對於相同的一系列加入一個冗餘結點,通過冗餘結點來指向關係
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<set>
#include<string>
#include<queue>
#define inf 1000000005
#define M 40
#define N 100005
#define maxn 300005
#define eps 1e-8
#define zero(a) fabs(a)<eps
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define mem(a,b) memset(a,b,sizeof(a))
#define LL long long
#define MOD 1000000007
#define lson step<<1
#define rson step<<1|1
#define sqr(a) ((a)*(a))
#define Key_value ch[ch[root][1]][0]
#define test puts("OK");
#define pi acos(-1.0)
#define lowbit(x) ((-(x))&(x))
#define HASH1 1331
#define HASH2 10001
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
struct Node{
int val,idx;
bool operator<(const Node n)const{
return val<n.val;
}
}a[N];
int n,m,in[N*2],cnt;
vector<int>edge[N*2];
queue<int>que;
void add(int u,int v){
in[v]++;
edge[u].pb(v);
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&a[j].val);
a[j].idx=j;
}
sort(a,a+m);
for(int j=0;j<m;j++){
if(a[j].val==-1) continue;
if(!j||a[j].val!=a[j-1].val) cnt++;
add(a[j].idx,m+cnt+1); //本身指向比自己大的
add(m+cnt,a[j].idx); //比自己小的指向自己
}
cnt++;
}
for(int i=0;i<m+cnt;i++)
if(!in[i])
que.push(i);
int ans[N],tot=0;
while(!que.empty()){
int u=que.front();que.pop();
if(u<m)
ans[tot++]=u;
for(int i=0;i<edge[u].size();i++){
int v=edge[u][i];
in[v]--;
if(!in[v])
que.push(v);
}
}
if(tot<m) puts("-1");
else{
for(int i=0;i<m;i++)
cout<<ans[i]+1<<(i==m-1?"\n":" ");
}
return 0;
}
相關文章
- 拓撲排序排序
- CF798E. Mike and code of a permutation [拓撲排序 線段樹]排序
- 拓撲排序,YYDS排序
- 拓撲排序模板排序
- 拓撲排序小結排序
- 圖論——拓撲排序圖論排序
- AOV網與拓撲排序排序
- Reward (圖論+拓撲排序)圖論排序
- 拓撲排序 - Topological Sort排序
- 拓撲排序核心程式碼排序
- HDU 4857 逃生(拓撲排序)排序
- 拓撲排序就這麼回事排序
- HDU4857逃生(拓撲排序)排序
- 紙上談兵: 拓撲排序排序
- poj 1094 拓撲排序排序
- 有向圖的拓撲排序——DFS排序
- poj1094 拓撲排序排序
- 圖解拓撲排序+程式碼實現圖解排序
- 【圖論】拓撲排序+優先佇列圖論排序佇列
- POJ 3249-Test for Job(拓撲排序&&DP)排序
- HDU 5438 Ponds (拓撲排序應用+DFS)排序
- HDU 4857-逃生(反向拓撲排序-按條件排序)排序
- 圖的拓撲排序詳解與實現排序
- 圖(3)--拓撲排序與關鍵路徑排序
- hdu 1811 並查集+拓撲排序並查集排序
- VOL.2 拓撲排序與關鍵路徑排序
- POJ1094[有向環 拓撲排序]排序
- csdn hud 2094 拓撲排序 已經AC排序
- 拓撲排序詳解(梅開二度之dfs版按字典序輸出拓撲路徑+dfs版輸出全部拓撲路徑排序
- 洛谷P3953 逛公園(dp 拓撲排序)排序
- HDU1285確定比賽名次(拓撲排序)排序
- Day2 尤拉路,拓撲排序和差分約束排序
- 拓撲排序 POJ2367Genealogical tree[topo-sort]排序
- 【BZOJ-1565】植物大戰殭屍 拓撲排序 + 最小割排序
- POJ1270 Following Orders[拓撲排序所有方案 Kahn]排序
- 網路拓撲圖:網路拓撲圖介紹及線上製作
- 牛客 51011 可達性統計(拓撲排序,bitset)排序
- POJ 3684-Labeling Balls(反向拓撲排序-按條件排序輸出重量)排序