首页 > 代码库 > Codevs 2611 观光旅游

Codevs 2611 观光旅游

  

 时间限制: 1 s  空间限制: 128000 KB  题目等级:钻石
 
题目描述 Description

某旅游区里面有N个景点。两个景点之间可能直接有道路相连,用a[i][j]表示它的长度,否则它们之间没有直接的道路相连。这里所说的道路是没有规定方向的,也就是说,如果从i到j有直接的道路,那么从j到i也有,并且长度与之相等。

旅游区规定:每个游客的旅游线路只能是一个回路(好霸道的规定)。也就是说,游客可以任取一个景点出发,依次经过若干个景点,最终回到起点。一天,Smart决定到这个景区来旅游,由于他实在已经很累了,于是他决定尽量少走一些路。

他想请你帮他求出最优的路线。怎么样,不是很难吧?

输入描述 Input Description

输入有多组数据。对于每组数据:

第一行有两个正整数N,M,分别表示景点个数和有多少对景点之间直接有边相连(N≤100,M≤10000);

接下来M行,每行三个正整数,分别表示一条道路的两端的编号,以及这条道路的长度(长度≤1000)。

输出描述 Output Description

对于每组数据,输出一行,如果该回路存在,则输出一个正整数,表示该回路的总长度;否则输出“No solution.”(不要输出引号)

样例输入 Sample Input

5 7

1 4 1

1 3 300

3 1 10

1 2 16

2 3 100

2 5 15

5 3 20

4 3

1 2 10

1 3 20

1 4 30

样例输出 Sample Output

61

No solution.

数据范围及提示 Data Size & Hint

N≤100,M≤10000

长度≤1000

技术分享
 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define INF 100000000 5 using namespace std; 6 int n,m; 7 int map[1000][1000],dis[1000][1000]; 8 int main() 9 {10     while((scanf("%d%d",&n,&m))==2)11     {12         for(int i=1;i<=n;i++)13           for(int j=1;j<=n;j++)14             map[i][j]=INF,dis[i][j]=INF;15         for(int i=1;i<=m;i++)16         {17             int x,y,z;18             cin>>x>>y>>z;19             if(map[x][y]>z)20               map[x][y]=map[y][x]=z,dis[x][y]=dis[y][x]=z;21         }22         23         int minn=INF;24         for(int k=1;k<=n;k++)// Floyed25         {26             for(int i=1;i<=k-1;i++)27               for(int j=i+1;j<=k-1;j++)28                 minn=min(minn,dis[i][j]+map[j][k]+map[k][i]);29             for(int i=1;i<=n;i++)30                 for(int j=1;j<=n;j++)31                     if(dis[i][j]>dis[i][k]+dis[k][j])32                       dis[i][j]=dis[i][k]+dis[k][j];33         }34         if(minn!=INF)35           printf("%d\n",minn);36         else printf("No solution.\n");37     }38     return 0;39 }
View Code

最小环 ~背模板

Codevs 2611 观光旅游