poj 3767 I Wanna Go Home

题目链接:http://poj.org/problem?id=3767

核心算法 Dijkstra
大意:N个城市,城市编号为1,2,3,……N
      M条路,路为双向路。 提供每条路的长度及端点城市编号,每两个城市之间直接连通的路最多一条。
      这N个城市分为两个集合,部分属于集合1,部分属于集合2,提供每个城市所属的集合,
   现要求从城市1出发去城市2,要求途径的路中最多出现一条其两端城市不属于同一个集合
   的路,求出符合该条件下的从城市1到城市2的最短路,若不存在符合条件的路,输出-1
      注:数据中城市1必定属于集合1,城市2必定属于集合2
        
   分析:由于城市1与城市2所属的集合固定,故在路径中必定有一条而且只能有一条路从属于集合
   1的城市出发进入城市2,而定不会出现从集合2走向集合1的城市。
   如此,M条路中凡是连接属于不同集合的城市的路为单向路,只能从集合1中的城市走向集合2,连接相同集合的为双向路。
   在此基础上用Dijkstra算法求最短路即可。

主要在于建图。昨天比赛刚开始做时用的方法是,标记然后两次Dijkstra,结果老是wa,然后就想在建图时处理下。只用一次就可以了。这题6次才过,竟然两次CE 太不小心了。

比较郁闷的是其他队,用BFS就过了 ,数据太水。

View Code
 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 using namespace std;
5 const int MAX=605;
6 int map[MAX][MAX];
7 int vist[MAX];
8 int dist[MAX];
9 struct ss{
10 int x,y,z;
11 }edge[10005];
12 int num[MAX],ans;
13 int n,m;
14 const int INF=99999999;
15 void dij( )
16 {
17 int i,j,v,ma;
18 memset(vist,0,sizeof(vist));
19 for(i=1;i<=n;i++)
20 dist[i]=map[1][i];
21 vist[1]=1;
22 dist[1]=0;
23 for(i=1;i<n;i++)
24 {
25 ma=INF;
26 for(j=1;j<=n;j++)
27 if(!vist[j]&&dist[j]<ma)
28 {
29 ma=dist[j];
30 v=j;
31 }
32 if(ma==INF)break;
33 vist[v]=1;
34 for(j=1;j<=n;j++)
35 {
36 if(!vist[j]&&dist[j]>map[v][j]+dist[v])
37 dist[j]=map[v][j]+dist[v];
38 }
39
40 }
41 }
42
43
44 int main()
45 {
46 int i,j;
47 while(scanf("%d",&n)&&n)
48 {
49 scanf("%d",&m);
50 for(i=1;i<=n;i++)
51 {
52 for(j=1;j<=n;j++)
53 {
54 map[i][j]=INF;
55 dist[i]=INF;
56 }
57 map[i][i]=0;
58 }
59 ans=INF;
60 for(i=1;i<=m;i++)
61 {
62 scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z);
63
64 }
65 for(i=1;i<=n;i++)
66 scanf("%d",&num[i]);
67
68 for(i=1;i<=m;i++)
69 {
70 if(num[edge[i].x]==num[edge[i].y])
71 {
72 map[edge[i].x][edge[i].y]=map[edge[i].y][edge[i].x]=edge[i].z;
73 }
74 else {
75 if(num[edge[i].x]==1)
76 map[edge[i].x][edge[i].y]=edge[i].z;
77 else map[edge[i].y][edge[i].x]=edge[i].z;
78 }
79 }
80 dij();
81
82 ans=dist[2];
83 if(ans>=INF)
84 printf("-1\n");
85 else
86 printf("%d\n",ans);
87 }
88 return 0;
89 }



posted @ 2012-03-30 10:38  我们一直在努力  阅读(356)  评论(0编辑  收藏  举报