洛谷P1137 旅行計劃
阿新 • • 發佈:2017-08-14
++ 旅遊 har space include etc efi main read
P1137 旅行計劃
題目描述
小明要去一個國家旅遊。這個國家有N個城市,編號為1~N,並且有M條道路連接著,小明準備從其中一個城市出發,並只往東走到城市i停止。
所以他就需要選擇最先到達的城市,並制定一條路線以城市i為終點,使得線路上除了第一個城市,每個城市都在路線前一個城市東面,並且滿足這個前提下還希望遊覽的城市盡量多。
現在,你只知道每一條道路所連接的兩個城市的相對位置關系,但並不知道所有城市具體的位置。現在對於所有的i,都需要你為小明制定一條路線,並求出以城市i為終點最多能夠遊覽多少個城市。
輸入輸出格式
輸入格式:
輸入的第1行為兩個正整數N, M。
接下來M行,每行兩個正整數x, y,表示了有一條連接城市x與城市y的道路,保證了城市x在城市y西面。
輸出格式:
輸出包括N行,第i行包含一個正整數,表示以第i個城市為終點最多能遊覽多少個城市。
輸入輸出樣例
輸入樣例#1:5 6 1 2 1 3 2 3 2 4 3 4 2 5輸出樣例#1:
1 2 3 4 3
說明
均選擇從城市1出發可以得到以上答案。
對於20%的數據,N ≤ 100;
對於60%的數據,N ≤ 1000;
對於100%的數據,N ≤ 100000,M ≤ 200000。
#include<iostream> #include80分 spfa TLE<cstdio> #include<cstring> #include<queue> using namespace std; #define maxm 200010 int n,m,ans,num,head[maxm],dp[100010],ru[100010]; queue<int>q; bool vis[100010]; struct node{ int pre,to; }e[maxm]; void Insert(int from,int to){ e[++num].to=to; e[num].pre=head[from]; head[from]=num; } void spfa(){ while(!q.empty()){ int point=q.front();q.pop();vis[point]=0; for(int i=head[point];i;i=e[i].pre){ int to=e[i].to; if(dp[to]<dp[point]+1){ dp[to]=dp[point]+1; if(!vis[to]){ vis[to]=1; q.push(to); } } } } } int qread(){ int i=0; char ch=getchar(); while(ch<‘0‘||ch>‘9‘)ch=getchar(); while(ch<=‘9‘&&ch>=‘0‘){i=i*10+ch-‘0‘;ch=getchar();} return i; } int main(){ n=qread();m=qread(); int x,y; for(int i=1;i<=m;i++){ x=qread();y=qread(); Insert(x,y); ru[y]++; } for(int i=1;i<=n;i++){ if(ru[i]==0){ q.push(i); vis[i]=1; dp[i]=1; } } spfa(); for(int i=1;i<=n;i++)printf("%d\n",dp[i]); }
洛谷P1137 旅行計劃