uva 208 Firetruck
2017-09-24 17:00
393 查看
题目:Firetruck
思路:
先从终点开始遍历一次全图,找出和它连通的点。再从起点开始dfs,这是只能走标记过的那些和终点连通的点。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<sstream>
#include<queue>
#include<set>
using namespace std;
#define maxn 21
bool mp[maxn+5][maxn+5];
int goal;
bool use[maxn+5]={0};
int cnt;
bool c[maxn+5]={0};
void cut(int x){
c[x]=true;
for(int i=1;i<maxn;i++){
if(mp[x][i]&&!c[i]) cut(i);
}
}
bool init(){
cnt=0;
memset(use,0,sizeof(use));
memset(mp,0,sizeof(mp));
memset(c,0,sizeof(c));
if(scanf("%d",&goal)!=1) return false;
int x,y;
while(scanf("%d%d",&x,&y)==2&&x!=0&&y!=0){
mp[x][y]=mp[y][x]=true;
}
return true;
}
void dfs(int x,vector<int> a){
if(x==goal){
for(int i=0;i<a.size();i++){
printf("%d ",a[i]);
}
printf("%d\n",goal);
cnt++;
return ;
}
a.push_back(x);
use[x]=true;
for(int i=1;i<maxn;i++){
if(mp[x][i]&&!use[i]&&c[i]){
dfs(i,a);
}
}
use[x]=false;
return ;
}
int main() {
int T=0;
while(init()){
printf("CASE %d:\n",++T);
cut(goal);
vector<int> x;
dfs(1,x);
printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,goal);
}
return 0;
}
思路:
先从终点开始遍历一次全图,找出和它连通的点。再从起点开始dfs,这是只能走标记过的那些和终点连通的点。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<sstream>
#include<queue>
#include<set>
using namespace std;
#define maxn 21
bool mp[maxn+5][maxn+5];
int goal;
bool use[maxn+5]={0};
int cnt;
bool c[maxn+5]={0};
void cut(int x){
c[x]=true;
for(int i=1;i<maxn;i++){
if(mp[x][i]&&!c[i]) cut(i);
}
}
bool init(){
cnt=0;
memset(use,0,sizeof(use));
memset(mp,0,sizeof(mp));
memset(c,0,sizeof(c));
if(scanf("%d",&goal)!=1) return false;
int x,y;
while(scanf("%d%d",&x,&y)==2&&x!=0&&y!=0){
mp[x][y]=mp[y][x]=true;
}
return true;
}
void dfs(int x,vector<int> a){
if(x==goal){
for(int i=0;i<a.size();i++){
printf("%d ",a[i]);
}
printf("%d\n",goal);
cnt++;
return ;
}
a.push_back(x);
use[x]=true;
for(int i=1;i<maxn;i++){
if(mp[x][i]&&!use[i]&&c[i]){
dfs(i,a);
}
}
use[x]=false;
return ;
}
int main() {
int T=0;
while(init()){
printf("CASE %d:\n",++T);
cut(goal);
vector<int> x;
dfs(1,x);
printf("There are %d routes from the firestation to streetcorner %d.\n",cnt,goal);
}
return 0;
}
相关文章推荐
- uva 208 - Firetruck
- UVA 208 Firetruck 消防车(回溯 + 剪枝)
- uva208 - Firetruck
- Uva 208 Firetruck(dfs并查集优化)
- uva 208 Firetruck (需要预先处理 再dfs,TLE是此题AC常规步骤……)
- UVA 208 Firetruck
- Firetruck UVA - 208
- uva208 - Firetruck
- uva208 Firetruck
- UVa 208 - Firetruck
- UVA 208 - Firetruck
- UVA - 208 Firetruck(回溯)
- UVa #208 Firetruck (习题7-1)
- uva 208 - Firetruck
- UVA 208 - Firetruck
- UVA 208 Firetruck
- UVA 208 Firetruck
- 【习题 7-1 UVA-208】Firetruck
- UVA 208 Firetruck
- UVa 208 - Firetruck(DFS判连通+回溯)