luogu題解 P5022 【旅行】
阿新 • • 發佈:2019-02-01
urn scanf 路徑 時間 scan 還需要 algorithm == 人的
本人的代碼可以說洛谷最簡單的了
我的存圖方式有些與眾不同
a[5000][5000]中第一個下標表示第幾個點,第二個表示與點相連的點
雖然比前向星廢內存但時間極快,大概是O(n)的。
現在步入正題
60分代碼思路
用深搜查找最小路徑很簡單
#include<cstdio> #include<algorithm> using namespace std; int n,m,a[5005][5005],lj[5005]={0},c[5005]={0},s=0,fs=1,h[5005]={0},huan=0,dd=0,b[5009][5009]; int cmp(int aa,int bb) { return a[aa]<a[bb]; } void dfs(int x) { c[x]++; if(s==1)return ; if(fs==n) { printf("\n"); s=1; return ; } for(int i=1;i<=lj[x];i++) { if(c[a[x][i]]==0) { printf("%d ",a[x][i]); fs++; dfs(a[x][i]); } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int aa,bb; scanf("%d%d",&aa,&bb); lj[aa]++; lj[bb]++; a[aa][lj[aa]]=bb; a[bb][lj[bb]]=aa; b[aa][bb]=1; } for(int i=1;i<=n;i++) sort(a[i]+1,a[i]+lj[i]+1,cmp); printf("1 "); if(m==n-1) dfs(1); return 0; }
至於滿分還需要n==m的情況
100分思路
先判斷環
將環找出
做好標記
再深搜在環上判斷
情況有很多詳見代碼
#include<cstdio> #include<algorithm> using namespace std; int n,m,a[5005][5005],lj[5005]={0},c[5005]={0},s=0,fs=1,h[5005]={0},huan=0,dd=0,b[5009][5009]; int cmp(int aa,int bb) { return a[aa]<a[bb]; } void dfs(int x) { c[x]++; if(s==1)return ; if(fs==n) { printf("\n"); s=1; return ; } for(int i=1;i<=lj[x];i++) { if(c[a[x][i]]==0) { printf("%d ",a[x][i]); fs++; dfs(a[x][i]); } } } void dfs1(int x) { c[x]++; if(s==1)return ; if(c[x]==2) { h[x]=1; huan=x; return ; } for(int i=1;i<=n;i++) { if((b[x][a[x][i]]==1||b[a[x][i]][x]==1)&&huan==0) { b[x][a[x][i]]=b[a[x][i]][x]=0; dfs1(a[x][i]); if(huan!=0&&huan!=x&&s!=1)h[x]=1; if(huan==x)s=1; } } } int dyc=0,huandedazhi=1000000,ag=0,hhl=0,bxyjz=0; int zb=100000; void ac(int x) { c[x]++; if(s==1)return ; if(fs==n) { printf("\n"); s=1; return ; } if(x==huan&&dyc==0) { dyc=1; int h1=0,h2; for(int i=1;i<=lj[x];i++) { if(h[a[x][i]]==1) { if(h1==0)h1=a[x][i]; else h2=a[x][i]; } } huandedazhi=max(h1,h2); zb=huandedazhi; } if(x==huandedazhi)ag=11; for(int i=1;i<=lj[x];i++) { if(c[a[x][i]]==0) { if(h[a[x][i]]==0) { printf("%d ",a[x][i]); fs++; ac(a[x][i]); } if(h[a[x][i]]==1) { if(a[x][i+1]!=0&&(a[x][i]<huandedazhi||ag==0)&&h[a[x][i+1]]==0&&h[x]==1) zb=a[x][i+1]; if(a[x][i]>zb&&ag==0) { ag=1; } else { printf("%d ",a[x][i]); fs++; ac(a[x][i]); } } } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int aa,bb; scanf("%d%d",&aa,&bb); lj[aa]++; lj[bb]++; a[aa][lj[aa]]=bb; a[bb][lj[bb]]=aa; b[aa][bb]=1; } for(int i=1;i<=n;i++) sort(a[i]+1,a[i]+lj[i]+1,cmp); printf("1 "); if(m==n-1) dfs(1); if(m==n) { dfs1(1); for(int i=1;i<=n;i++)c[i]=0;s=0; ac(1); } }
luogu題解 P5022 【旅行】