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]
- poj1637 Sightseeing tour(混合圖尤拉回路)
- POJ--2406Power Strings+KMP求字串最小週期KMP字串
- POJ 2253 Frogger(Floyd Dij Spfa變形)
- 無向連通圖求割點和橋
- distance(Floyd求最短路)
- POJ 1094 Sorting It All Out Floyd_Washall+Topological_sort
- 拓撲排序 (BFS )DAG (有向無環圖)排序
- 圖-無向圖
- 雙陣列Trie樹高效構建有向無環圖陣列
- P1989 無向圖三元環計數
- poj--3264Balanced Lineup+ST演算法求區間最大最小值演算法
- HDU1874——暢通工程續(floyd最小路)
- Networking POJ - 1287(kuangbin最小生成樹)
- POJ3660 Cow Contest【Floyd演算法 傳遞閉包】演算法
- POJ 3613 Cow Relays 矩陣乘法Floyd+矩陣快速冪矩陣
- [簡易版]有向無環圖(DAG)前端視覺化前端視覺化
- C++輸出有向無環圖的所有拓撲序列C++
- BZOJ4773: 負環(倍增Floyd)
- 無向圖最小割問題取得新突破,谷歌研究獲SODA 2024最佳論文獎谷歌
- (樹_)求最小深度
- 【圖論】Floyd演算法圖論演算法
- 如何在 Java 中實現無向環和有向環的檢測Java
- 求最短路徑——DFS+Floyd演算法演算法
- 圖的最短路徑(Dijkstra | Floyd)
- 求最小k個數
- POJ 1611 The Suspects 圖論圖論
- Tarjan 求有向圖的強連通分量
- 待補 重要思考:求給無向圖定向使得其變為DAG的方案數
- Python求最小公倍數Python
- 快速求圖上最小點定聯通塊權值的Trick
- abc369E Sightseeing Tour
- 致同:變中求進 躍向無界未來
- 如何在 Java 中實現無向圖Java
- 判斷一個有向圖是否有環
- POJ 3259-Wormholes(簡單判負環)Worm
- POJ1915,雙向寬度優先搜尋