7-1 FireTruck 消防车 uva208
生活随笔
收集整理的這篇文章主要介紹了
7-1 FireTruck 消防车 uva208
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意: 輸入一個n <=20 個結點的無向圖以及某個結點k ? 按照字典序從小到大順序輸出從結點1到結點k的所有路徑 ?要求結點不能重復經過
標準回溯法
要實現從小到大字典序 現在數組中排序好即可 ??
標記數組一定要刪去!!!!切記 ? 又因為這個弄錯了?
?
提高效率的方法:
先遍歷一遍所有點 ?把和k點相關的點存入數組中 ? 那些無關的點根本用不到 ??
同時也解決了如果 1與k不相連所造成的大量時間浪費
#include<bits/stdc++.h> using namespace std; #define N 22 int k; int path[N]; int mp[N][N]; int cnt=0; int vis[N]; vector<int>s; void dfs1(int x) {vis[x]=1;s.push_back(x);for(int i=1;i<21;i++)if(mp[x][i]&&!vis[i])dfs1(i); }void dfs(int node,int cur) {if(node==k){cnt++;printf("1");for(int i=1;i<cur;i++)printf(" %d",path[i]);printf("\n");}for(int i=1;i<s.size();i++){if(mp[node][s[i]])if(!vis[ s[i] ]){path[cur]=s[i];vis[ s[i] ]=1;dfs( s[i] ,cur+1);vis[ s[i] ]=0;}} }int main() { int cas=0;while(scanf("%d",&k)==1&&k){int a,b;memset(mp,0,sizeof mp);while(scanf("%d %d",&a,&b)&&b&&a){mp[a][b]=mp[b][a]=1;}s.clear();path[0]=1;cnt=0;dfs1(k);sort(s.begin(),s.end());memset(vis,0,sizeof vis);printf("CASE %d:\n",++cas);dfs(1,1);printf("There are %d routes from the firestation to streetcorner %d.\n", cnt, k);} }?
轉載于:https://www.cnblogs.com/bxd123/p/10416035.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的7-1 FireTruck 消防车 uva208的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝后台如何查看自己的签约详情
- 下一篇: js 打印