路径只能由小序号到大序号..(起点可以视为最小的序号和最大的序号) 问怎么走 happy值最大..

DFS

N=100 且只能小序号到大序号 显然dfs可以过..

但是存路径的时候sb了.....应该在更新答案时拿一个ans_dis数组去全部存一遍路径...

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
const int maxn=105;
const int inf=-0x3f3f3f3f;
int w[maxn];
int dis[maxn];
struct edge
{
int to;
edge *next;
}E[maxn*maxn],*EE;
struct node
{
edge *frist;
}Graph[maxn];
int N,M;
int pre[maxn];
void Link(int u,int v)
{
EE->to=v;EE->next=Graph[u].frist;Graph[u].frist=EE++;
// EE->to=u;EE->next=Graph[v].frist;Graph[v].frist=EE++;
}
void input()
{
cin>>N;
memset(Graph,0,sizeof(Graph));
memset(pre,0,sizeof(pre));
memset(dis,0,sizeof(dis));
EE=E;
for(int i=1;i<=N;i++)
{
scanf("%d",&w[i]);
}
cin>>M;
int a,b;
for(int i=1;i<=M;i++)
{
scanf("%d%d",&a,&b);
if(b==N+1) b=1;
if(a==N+1) a=1;
Link(a,b);
}
}
int ans=-1;
int dfs(int P,int n,int ok,int W)
{
pre[n]=P;
if(ok==1&&n==1)
{
if(W>ans)
{
int p=pre[n];
dis[n]=pre[n];
while(p!=1)
{dis[p]=pre[p];p=pre[p];}
ans=W;
}
return 0;
}
else
{ for(edge *p=Graph[n].frist;p;p=p->next)
{
if(p->to>n||p->to==1){dfs(n,p->to,1,W+w[n]);}
}
}
}
void output(int n,int ok)
{
if(n==1&&ok==1)
{
printf("%d",n);
}
else {
output(dis[n],1);
printf("->%d",n);
}
}
int CASE=0;
int T;
void solve()
{
ans=inf;
dfs(0,1,0,0);
printf("%d\n",ans);
printf("circuit : ");
output(1,0);
printf("\n");
if(T!=0) printf("\n");
}
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
} int main()
{
// init(); cin>>T;
while(T--)
{
printf("CASE %d#\n",++CASE);
printf("points : ");
input();
solve();
}
return 0;
}

最短路

Floyd

利用floyd..在循环的时候修改一下循环次数即可

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
const int maxn=105;
const int inf=-0x3f3f3f3f;
int T;
int N,M;
int w[maxn];
int MAP[maxn][maxn];
int F[maxn][maxn];
int dis[maxn][maxn];
void input()
{
memset(MAP,0,sizeof(MAP));
memset(dis,0,sizeof(dis));
int a,b;
cin>>N;
for(int i=1;i<=N;i++)
{
scanf("%d",&w[i]);
w[i]=-w[i];
}
w[N+1]=0;
cin>>M;
for(int i=1;i<=M;i++)
{
scanf("%d%d",&a,&b);
MAP[a][b]=1;
}
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn;j++)
{
F[i][j]=-inf;
if(MAP[i][j]==1)
F[i][j]=0;
}
}
void floyed()
{
for(int i=1;i<=N+1;i++)
for(int j=1;j<=N+1;j++)
dis[i][j]=j;
for(int k=1;k<=N+1;k++)
for(int i=1;i<k;i++)
for(int j=k+1;j<=N+1;j++)
{
if(F[i][k]+F[k][j]+w[k]<F[i][j])
{
F[i][j]=F[i][k]+F[k][j]+w[k];
dis[i][j]=dis[i][k];
}
}
printf("points : %d\n",-F[1][N+1]);
printf("circuit : ");
for(int p=1;1;p=dis[p][N+1])
{
if(p==N+1){printf("1");break;}
else{
printf("%d->",p);
}
}
printf("\n");
if(T!=0) printf("\n"); }
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int main()
{
int CASE=0;
// init();
cin>>T;
while(T--)
{
printf("CASE %d#\n",++CASE); input();
floyed();
}
}

最新文章

  1. ssh改https为ssh
  2. 每天一个linux命令(44):top命令
  3. vue安装
  4. HTML学习体会
  5. mysql 在linux 修改账号密码
  6. django 执行原始SQL
  7. 关于机器学习-EM算法新解
  8. Git flow 的流程
  9. 【原创】纯OO:从设计到编码写一个FlappyBird (五)
  10. Spring中的Service/DAO/DTO
  11. 在ASP.NET Core中构建路由的5种方法
  12. 类型和原生函数及类型转换(二:终结js类型判断)
  13. Windows系统下查看某一进程下所有线程的dos命令
  14. PID实战-STM32电机PWM力矩调节系统
  15. 在Intellij IDEA下通过Hibernate逆向生成实体类
  16. Spring事务管理的配置
  17. ionic tab显示到顶部去了
  18. Lucene - CustomScoreQuery 自定义排序
  19. hadoop最新版本介绍之dkhadoop版本选择
  20. 比较有意思的原生态js拖拽写法----摘自javascript高级程序设计3

热门文章

  1. SQL递归查询实现跟帖盖楼效果
  2. 浏览器缓存相关http头
  3. PCI、PCIE配置空间的訪问(MCFG,Bus,Device,Funtion)
  4. 【设计模式:单例模式】使用单例模式载入properties文件
  5. FCKeditor
  6. winform最小化到托盘
  7. js 去掉空格
  8. javascript 高级程序设计学习笔记(面向对象的程序设计)继承
  9. Java开发23中设计模式
  10. CS0016: 未能写入输出文件*****目录名称无效