description
在乙個byteland上有一副非常有名的圖畫需要被封存。這個作品需要在2個實驗室進行處理。這個處理過程被分為許多步驟。對於每個步驟,我們知道它必須要在哪個實驗室進行。
在兩個實驗室之間運輸這些這些美麗但又易碎的畫會帶來額外的風險,因此這個運輸的過程需要盡可能的被避免。理想情況下所有的工作都會在第乙個實驗室做完,然後剩下的在另乙個實驗室完成,但是有些步驟必須在另一步驟完成之後才能完成。你的任務是找到乙個工作的順序,讓這個被運輸的過程最少。輸出需要運輸的次數。
input
第一行n和m,代表著n個步驟,和m個先後關係。下面一行n個數字,第i個數字是1或2,代表了第i個工作需要在哪個實驗室完成,下面m行i,j,代表了第i個工作必須在第j個工作前完成。
你可以認為這個題目必有解
output
輸出最少需要的運輸次數。
samples
input copy
5 61 2 1 2 1
1 21 3
2 43 4
2 53 5
output
2hint
【資料範圍與約定】
30%資料保證n≤5。
100%資料中n≤100000,m≤1000000。
n個點,每個點有個一值(1或者2),m條邊,如果邊為u->v 那麼必須先完成工作u再完成工作v,求乙個序列使得序列中1和2的交替次數最小
m條邊,如果邊為u->v 那麼必須先完成工作u再完成工作v很明顯是個拓撲排序了
我們要盡可能少的在序列**現12交替,那麼如果此時我們拓撲排序時出隊的是u點,u點所連線的點v的入度減,如果v點成為滿足條件的點而且v點與u點的點權相同的話,那麼v點入隊,如果不同就把v點存起來,直到佇列中不存在和當前點權相同的點,我們此時不得不交換一次串行使ans++,然後重複上述操作
我一開始設了兩個佇列,乙個存點權為1的點另乙個存點權為2的點,然後調bug未遂(逃),
coolguang學長教我 用乙個超級原點,連向所有的點,因為起點可能是0或者1,兩次取min就ok了
10分鐘後我又來更新了,我找出bugle
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
typedef pair<
int,
int> pii;
typedef
unsigned
long
long ull;
const
int inf =
0x3f3f3f3f
;const
int maxn =
1e5+7;
const ll mod =
1000000007
;#define mst(x, a) memset( x,a,sizeof(x) )
#define rep(i, a, b) for(int i=(a);i<=(b);++i)
#define dep(i, a, b) for(int i=(a);i>=(b);--i)
int n,m,a[
100002
],d[
100002
],dd[
100002
],cnt;
vector<
int>e[maxn]
,g;int
slove
(int st)}if
(flag==
1) flag=2;
else flag=1;
if(g.
size()
==0)break;}
return ans;
}int
main()
for(
int i=
1; i<=m ; i++
)int ans1=
slove(1
);int ans2=
slove(2
);cout<<
min(ans1,ans2)
}/**
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
typedef pair<
int,
int> pii;
typedef
unsigned
long
long ull;
const
int inf =
0x3f3f3f3f
;const
int maxn =
2e5+7;
const ll mod =
1000000007
;#define mst(x, a) memset( x,a,sizeof(x) )
#define rep(i, a, b) for(int i=(a);i<=(b);++i)
#define dep(i, a, b) for(int i=(a);i>=(b);--i)
intread()
void
out(ll x)if(
!x)int top =0;
while
(x) stackk[
++top]
= x %
10, x /=10
;while
(top)
putchar
(stackk[top--]+
'0');}
int n,m,a[maxn]
,d[maxn]
,dd[maxn]
,cnt;
vector<
int>e[maxn]
;int
slove
(int st)
}while(1
)}}else}}
}return ans;
}int
main()
int ans1=
slove(1
);int ans2=
slove(2
);out(
min(ans1,ans2));
return0;
}/**
5 61 2 1 2 1
1 21 3
2 43 4
2 53 5
**/
簡單DP 拓撲排序 拓撲排序 DP兩練
portkey 單源單匯就是最長路 多源單匯就是反一下最長路 多源多匯就是拓撲排序 include using namespace std define in read int in const int n 2e5 5 int n,m,deg n f n vector int g n void to...
周記 拓撲排序
拓撲排序的英文名是 topological sorting。拓撲排序要解決的問題是給乙個圖的所有節點排序。拓撲排序的目標是將所有節點排序,使得排在前面的節點不能依賴於排在後面的節點。oi wiki 拓撲排序是在dag 有向無環圖 中每次選則入度為 0 的節點加入佇列,並刪除與這個節點相連的邊,重複執...
第十三周 專案五 拓撲排序
檔名稱 graph.cpp 完成日期 2016年12月8日 版本號 vc 6.0 問題描述 拓撲排序 輸入描述 無 程式輸出 graph.cpp include include include graph.h 功能 由乙個反映圖中頂點鄰接關係的二維陣列,構造出用鄰接矩陣儲存的圖 引數 arr 陣列名...