poj 1734 无向图的最小环
来源:互联网 发布:lt1953wa淘宝 编辑:程序博客网 时间:2024/05/05 05:41
无向图的最小环:从某个点出发走回自己的最短路径,路径上至少有三个点
搜索做法:
View Code
1 //PKU 1734 无向图的最小环,搜索做法
2 #include<stdio.h>
3 #include<vector>
4 #include<string.h>
5 using namespace std;
6 const int N = 110;
7 const int inf = 1e8;
8 struct node{
9 int to,w;
10 };
11 vector<node> QQ[N];
12 bool vis[N];
13 int S,ans[N],temp[N],best,ans_nodes;
14 void dfs(int now,int fa,int dep,int sum)
15 {
16 int i;
17 if(now==S&&vis[S])
18 {
19 if(sum<best)
20 {
21 best=sum;ans_nodes=dep;
22 for(i=0;i<dep;i++)
23 ans[i]=temp[i];
24 }
25 return ;
26 }
27 temp[dep]=now;
28 for(i=0;i<QQ[now].size();i++)
29 {
30 if(QQ[now][i].to!=S&&vis[QQ[now][i].to]) continue;
31 if(QQ[now][i].to==fa) continue;
32 vis[QQ[now][i].to]=true;
33 if(QQ[now][i].w+sum<best)
34 dfs(QQ[now][i].to,now,dep+1,sum+QQ[now][i].w);
35 vis[QQ[now][i].to]=false;
36 }
37 }
38 int main()
39 {
40 int n,m;
41 int i,w,s,t;
42 scanf("%d%d",&n,&m);
43 node tmp;
44 for(i=0;i<m;i++)
45 {
46 scanf("%d%d%d",&s,&t,&w);
47 tmp.to=t;
48 tmp.w=w;
49 QQ[s].push_back(tmp);
50 tmp.to=s;
51 QQ[t].push_back(tmp);
52 }
53 best=inf;//错误原因:全局变量在这里又定义了一遍,汗!!!!
54 for(i=1;i<=n;i++)
55 {
56 memset(vis,false,sizeof(vis));
57 S=i;
58 dfs(i,-1,0,0);
59 }
60 if(best==inf) printf("No solution.\n");
61 else
62 {
63 printf("%d",ans[0]);
64 for(i=1;i<ans_nodes;i++)
65 printf(" %d",ans[i]);
66 }
67 printf("\n");
68 return 0;
69 }
floyd 做法
View Code
1 #include<stdio.h>
2 #include<string.h>
3 const int N = 110;
4 const int inf = 123456789;
5 int map[N][N];
6 int dis[N][N],pre[N][N];
7 int n,m;
8 int best,nn;
9 int ans[N];
10 void floyd()//类似于floyd的思想
11 {
12 int i,j,k,p;
13 for(k=1;k<=n;k++)
14 {
15 for(i=1;i<=k;i++)
16 {
17 for(j=1;j<=k;j++)
18 {
19 if(map[i][k]&&map[k][j]&&i!=j)
20 {
21 int tmp=dis[i][j]+map[k][i]+map[j][k];//从k点出发回到k点
22 if(tmp<best)
23 {
24 best=tmp;
25 nn=1;ans[0]=k,p=i;
26 while(p!=-1)
27 {
28 ans[nn++]=p;
29 p=pre[p][j];
30 }
31 }
32 }
33 }
34 }
35 for(i=1;i<=n;i++)
36 for(j=1;j<=n;j++)
37 {
38 if(dis[i][j]>dis[i][k]+dis[k][j])
39 {
40 dis[i][j]=dis[i][k]+dis[k][j];
41 pre[i][j]=pre[i][k];
42 }
43 }
44 }
45 }
46 int main()
47 {
48 int i,j,k,a,b,w;
49 while(scanf("%d",&n)!=EOF)
50 {
51 if(n==-1) break;
52 memset(pre,-1,sizeof(pre));
53 memset(map,0,sizeof(map));
54 scanf("%d",&m);
55 for(i = 0; i <= n; ++i) {
56 for(j = i+1; j <= n; ++j)
57 dis[i][j] = dis[j][i] = inf;
58 dis[i][i] = 0;
59 }
60 for(i=0;i<m;i++)
61 {
62 scanf("%d%d%d",&a,&b,&w);
63 map[a][b]=map[b][a]=dis[a][b]=dis[b][a]=w;
64 pre[a][b]=b,pre[b][a]=a;
65 }
66 best=inf;
67 floyd();
68 if(best==inf) printf("No solution.\n");
69 else
70 {
71 printf("%d",ans[0]);
72 for(i=1;i<nn;i++)
73 {
74 printf(" %d",ans[i]);
75 }
76 printf("\n");
77 }
78 }
79 return 0;
80 }
- POJ 1734 Sightseeing trip 无向图的最小环
- poj 1734 无向图的最小环
- POJ 1734 - Sightseeing trip 用Floyd找无向图的最小环
- 无向图最小环
- poj 无向图最小环问题 详解,模板
- 有向图无向图的最小环。
- POJ-1734 Sightseeing trip (无向图最小环[Floyd])
- hdu1599求无向图的最小环
- hdu1599 无向图最小环
- 无向图-最小环-Floyd
- 无向图最小环算法floy
- 【Floyd求无向图的最小环】PKU-1734-Sightseeing trip
- poj 1734 Floyd算求有向图的最小环
- 最小环(有向无向均可)
- BOJ 297 最小环问题 无向图最小环,floyd
- FZU 2090 无向图最小环 floyd
- HDU1599 find the mincost route 无向图最小环
- 找无向图最小环 floyd算法
- poj 3199 高精度 java
- poj 1001 java
- hdu 1509 优先队列
- zstu 2386 && 1910 poj 3071 概率DP
- hdu 1551 二分
- poj 1734 无向图的最小环
- poj 2305 java b进制取余
- linux虚存管理机制
- poj 2084 JAVA 卡特兰数
- hdu 1002 java 大数相加
- hdu 1063 java 高精度
- 斐波那契数 java
- hdu 1753 java 小数相加
- poj 3140 简单dfs