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 }



原创粉丝点击