【Floyd算法】Gym - 101572I - Import Spaghetti
题意:有向图最小环,输出方案。
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
int n;
map<string,int>ma;
string mb[505];
int a[505][505],ans=2147483647;
int path[505][505];
int main(){
//freopen("i.in","r",stdin);
memset(a,0x7f,sizeof(a));
scanf("%d",&n);
for(int i=1;i<=n;++i){
cin>>mb[i];
ma[mb[i]]=i;
}
string x,z;
int y;
for(int i=1;i<=n;++i){
cin>>x>>y;
if(!y){
continue;
}
int ma_x=ma[x];
int cnt=0;
while(1){
cin>>z;
if(z=="import"){
continue;
}
if(z[z.length()-1]!=','){
++cnt;
}
else{
z.erase(z.length()-1,1);
}
if(ma[z]==ma_x){
cout<<z<<endl;
return 0;
}
a[ma_x][ma[z]]=1;
path[ma_x][ma[z]]=ma[z];
if(cnt==y){
break;
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
for(int k=1;k<=n;++k){
if(i!=j && j!=k && a[j][i]<2000000000 && a[i][k]<2000000000){
if(a[j][i]+a[i][k]<a[j][k]){
a[j][k]=a[j][i]+a[i][k];
path[j][k]=path[j][i];
}
else if(a[j][i]+a[i][k]==a[j][k]){
if(path[j][k]==0){
path[j][k]=path[j][i];
}
}
}
}
}
}
int I,J;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(i!=j){
if(ans-a[i][j]>a[j][i]){
ans=a[i][j]+a[j][i];
I=i;
J=j;
}
}
}
}
if(ans>2000000000){
puts("SHIP IT");
return 0;
}
int U=I;
cout<<mb[U];
while(U!=J){
cout<<' '<<mb[path[U][J]];
U=path[U][J];
}
U=J;
while(path[U][I]!=I){
cout<<' '<<mb[path[U][I]];
U=path[U][I];
}
puts("");
return 0;
}
附无向图最小环(转自 http://www.cnblogs.com/kane0526/archive/2012/11/09/2763170.html):
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; const int maxn=110;
const int INF=0x7ffffff;
int dist[maxn][maxn], map[maxn][maxn];
int pre[maxn][maxn];
int path[maxn];
int n, m, num, minc; void floyd()
{
minc=INF;
for(int k=1; k<=n; k++)
{
for(int i=1; i<k; i++)
for(int j=i+1; j<k; j++)
{
int ans=dist[i][j]+map[i][k]+map[k][j];
if(ans<minc) //找到最优解
{
minc=ans;
num=0;
int p=j;
while(p!=i) //逆向寻找前驱遍历的路径并将其存储起来
{
path[num++]=p;
p=pre[i][p];
}
path[num++]=i;
path[num++]=k;
}
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
if(dist[i][j]>dist[i][k]+dist[k][j])
{
dist[i][j]=dist[i][k]+dist[k][j];
pre[i][j]=pre[k][j];
}
}
}
} int main()
{
int u, v, cost;
while(cin >> n)
{
if(n<0) break;
cin >> m;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
dist[i][j]=map[i][j]=INF;
pre[i][j]=i;
}
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&u,&v,&cost);
if(dist[u][v]>cost) //处理重边
map[u][v]=map[v][u]=dist[u][v]=dist[v][u]=cost;
}
floyd();
if(minc==INF)
printf("No solution.\n");
else
{
printf("%d",path[0]);
for(int i=1; i<num; i++)
printf(" %d",path[i]);
puts("");
}
}
return 0;
}
【Floyd算法】Gym - 101572I - Import Spaghetti的更多相关文章
- 最短路径—Dijkstra算法和Floyd算法
原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...
- 数据结构与算法--最短路径之Floyd算法
数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...
- POJ-3660(Floyd算法)
Cow Contest POJ-3660 1.本题考察的是最短路,用的算法是Floyd算法 2.如果一个结点和剩余的n-1个结点都有关系,那么可以确定其排名 3.需要注意的是,判断是否有关系时,反向关 ...
- 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
一.名称 动态规划法应用 二.目的 1.掌握动态规划法的基本思想: 2.学会运用动态规划法解决实际设计应用中碰到的问题. 三.要求 1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可): 2 ...
- 最短路径之Floyd算法
Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...
- 最短路径问题——floyd算法
floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...
- floyd算法小结
floyd算法是被大家熟知的最短路算法之一,利用动态规划的思想,f[i][j]记录i到j之间的最短距离,时间复杂度为O(n^3),虽然时间复杂度较高,但是由于可以处理其他相似的问题,有着广泛的应用,这 ...
- Uvaoj 10048 - Audiophobia(Floyd算法变形)
1 /* 题目大意: 从一个点到达另一个点有多条路径,求这多条路经中最大噪音值的最小值! . 思路:最多有100个点,然后又是多次查询,想都不用想,Floyd算法走起! */ #include< ...
- Floyd算法(三)之 Java详解
前面分别通过C和C++实现了弗洛伊德算法,本文介绍弗洛伊德算法的Java实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明 ...
随机推荐
- iOS网络基础---iOS-Apple苹果官方文档翻译
CHENYILONG Blog iOS网络基础---iOS-Apple苹果官方文档翻译 iOS网络基础 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http: ...
- 【leetcode 简单】第一题 两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...
- Python面向对象学习 1 (什么是面向对象,面向对象的应用场景,待更新)
程序设计的三种基本结构: 面向对象,面向过程,函数式编程 1,什么是面向对象编程 面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就 ...
- Coursera在线学习---第四节.过拟合问题
一.解决过拟合问题方法 1)减少特征数量 --人为筛选 --靠模型筛选 2)正则化(Regularization) 原理:可以降低参数Θ的数量级,使一些Θ值变得非常之小.这样的目的既能保证足够的特征变 ...
- Perl6多线程2: Promise new/keep/bread/status/result
来源于个人理解的翻译. 创建一个 promise: my $p = Promise.new; 可以打印运行 的Promise 状态: my $p = Promise.new(); $p.then({s ...
- easyui datagrid 去掉 全选checkbox
在加载 表格的时候添加事件:onLoadSuccess 在事件中写入下面句,用空代替原有HTML 达到取消效果. $(".datagrid-header-check").html( ...
- localhost或127.0.0.1或192.168.1.*被转到129129.com上的问题
系统启动里会有个httpd的apache程序在运行,自启禁用掉后.windows下有个apache文件夹,干掉就可以. 个别GHOST XP程序里面会装这种流氓程序.
- Codeforces Round #456 (Div. 2)
Codeforces Round #456 (Div. 2) A. Tricky Alchemy 题目描述:要制作三种球:黄.绿.蓝,一个黄球需要两个黄色水晶,一个绿球需要一个黄色水晶和一个蓝色水晶, ...
- <转>MYSQL数据库数据拆分之分库分表总结
数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 数据存储演进思路二:单库多表 随着用户数量的 ...
- 端口扫描———nmap
nmap教程之nmap命令使用示例(nmap使用方法) 浏览:8268 | 更新:2014-03-29 17:23 Nmap是一款网络扫描和主机检测的非常有用的工具.Nmap是不局限于仅仅收集信息和枚 ...