POJ 1734 Sightseeing trip Floyd求無向圖最小環
title
Time Limit: 1000MS | Memory Limit: 65536K |
---|---|
Total Submissions: 8874 | Accepted: 3305 Special Judge |
Description
There is a travel agency in Adelton town on Zanzibar island. It has decided to offer its clients, besides many other attractions, sightseeing the town. To earn as much as possible from this attraction, the agency has accepted a shrewd decision: it is necessary to find the shortest route which begins and ends at the same place. Your task is to write a program which finds such a route.
In the town there are N crossing points numbered from 1 to N and M two-way roads numbered from 1 to M. Two crossing points can be connected by multiple roads, but no road connects a crossing point with itself. Each sightseeing route is a sequence of road numbers y_1, …, y_k, k>2. The road y_i (1<=i<=k-1) connects crossing points x_i and x_{i+1}, the road y_k connects crossing points x_k and x_1. All the numbers x_1,…,x_k should be different.The length of the sightseeing route is the sum of the lengths of all roads on the sightseeing route, i.e. L(y_1)+L(y_2)+…+L(y_k) where L(y_i) is the length of the road y_i (1<=i<=k). Your program has to find such a sightseeing route, the length of which is minimal, or to specify that it is not possible,because there is no sightseeing route in the town.
Input
The first line of input contains two positive integers: the number of crossing points N<=100 and the number of roads M<=10000. Each of the next M lines describes one road. It contains 3 positive integers: the number of its first crossing point, the number of the second one, and the length of the road (a positive integer less than 500).
Output
There is only one line in output. It contains either a string ‘No solution.’ in case there isn’t any sightseeing route, or it contains the numbers of all crossing points on the shortest sightseeing route in the order how to pass them (i.e. the numbers x_1 to x_k from our definition of a sightseeing route), separated by single spaces. If there are multiple sightseeing routes of the minimal length, you can output any one of them.
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
Sample Output
1 3 5 2
Source
CEOI 1999
code
#include<algorithm>
#include<bitset>
#include<cctype>
#include<cerrno>
#include<clocale>
#include<cmath>
#include<complex>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<limits>
#include<list>
#include<map>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<string>
#include<utility>
#include<vector>
#include<cwchar>
#include<cwctype>
using namespace std;
typedef long long ll;
const int maxn=310;
template<typename T>inline void read(T &x)
{
x=0;
T f=1,ch=getchar();
while (!isdigit(ch) && ch^'-') ch=getchar();
if (ch=='-') f=-1, ch=getchar();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
x*=f;
}
int a[maxn][maxn],d[maxn][maxn],pos[maxn][maxn];
int ans=0x3f3f3f3f;
vector<int>path;
inline void get_path(int x,int y)
{
if (!pos[x][y]) return ;
get_path(x,pos[x][y]);
path.push_back(pos[x][y]);
get_path(pos[x][y],y);
}
int main()
{
int n,m;
read(n);read(m);
memset(a,0x3f,sizeof(a));
for (int i=1;i<=n;++i)
a[i][i]=0;
for (int i=1;i<=m;++i)
{
int x,y,z;
read(x);read(y);read(z);
a[y][x]=a[x][y]=min(a[x][y],z);
}
memcpy(d,a,sizeof(a));
for (int k=1;k<=n;++k)
{
for (int i=1;i<k;++i)
for (int j=i+1;j<k;++j)
if ((ll)d[i][j]+a[j][k]+a[k][i]<ans)
{
ans=d[i][j]+a[j][k]+a[k][i];
path.clear();
path.push_back(i);
get_path(i,j);
path.push_back(j);
path.push_back(k);
}
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
if (d[i][j]>d[i][k]+d[k][j])
{
d[i][j]=d[i][k]+d[k][j];
pos[i][j]=k;
}
}
if (ans==0x3f3f3f3f)
{
puts("No solution.");
exit(0);
}
for (int i=0;i<path.size();++i)
printf("%d ",path[i]);
puts("");
return 0;
}
相關文章
- 無向圖的最小環問題[TODO]
- POJ 1523 SPF (無向圖求割點 tarjan演算法)演算法
- poj2594Treasure Exploration【最小路徑覆蓋+floyd傳遞閉包】
- 演算法學習之路|有向無環圖(DAG)求最長路演算法
- POJ 2240 Arbitrage(Floyd最短路)
- POJ 3301 Texas Trip(三分)
- 拓撲排序 (BFS )DAG (有向無環圖)排序
- POJ--2406Power Strings+KMP求字串最小週期KMP字串
- POJ1094[有向環 拓撲排序]排序
- 雙陣列Trie樹高效構建有向無環圖陣列
- 最小樹形圖(有向圖的最小生成樹)朱劉演算法演算法
- [簡易版]有向無環圖(DAG)前端視覺化前端視覺化
- C++輸出有向無環圖的所有拓撲序列C++
- P1989 無向圖三元環計數
- UVA 10859 有向無環圖的動態規劃動態規劃
- POJ 3613 Cow Relays 矩陣乘法Floyd+矩陣快速冪矩陣
- 【圖論】Floyd演算法圖論演算法
- POJ 1094 Sorting It All Out Floyd_Washall+Topological_sort
- POJ3660 Cow Contest【Floyd演算法 傳遞閉包】演算法
- 如何在 Java 中實現無向環和有向環的檢測Java
- POJ 2051(最小堆/優先佇列)佇列
- 求最短路徑——DFS+Floyd演算法演算法
- poj--3264Balanced Lineup+ST演算法求區間最大最小值演算法
- 無向圖最小割問題取得新突破,谷歌研究獲SODA 2024最佳論文獎谷歌
- POJ 3308 Paratroopers 最小割、最大流OOP
- Tarjan 求有向圖的強連通分量
- 給那些不怕類似“有向無環圖”字眼的人簡單介紹gitGit
- C語言實現有向無環圖的拓撲排序演算法C語言排序演算法
- 待補 重要思考:求給無向圖定向使得其變為DAG的方案數
- 快速求圖上最小點定聯通塊權值的Trick
- POJ 1465-Multiple(BFS-最小整倍數)
- POJ 2195 Going Home 最小費用最大流Go
- POJ 2195 Going Home (最小費用最大流)Go
- poj 3164 Command Network(最小樹形圖模板題)朱_ 劉演算法演算法
- Python求最小公倍數Python
- 如何在 Java 中實現無向圖Java
- POJ 3565 Ants (最小權完美匹配 KM演算法)演算法
- abc369E Sightseeing Tour