Description

小明来到青岛上学已经一年了,他给青岛这座城市画了一张地图。在这个地图上有n个点,小明的起始点为1号点,终点为n号点,并且地图上的所有边都是单向的。小明知道从i号点到j号点的时间花费为w分钟,那么问题来了,求从1号点到n号的最小时间花费是多少?这个最少花费的路径有多少条?

Input

输入格式:输入文件第一行为两个空格隔开的数n,m,表示这张地图里有多少个点及有多少边的信息。下面m行,每行三个数I、J、w,表示从I点到J点有道路相连且花费为w.(注意,数据提供的边信息可能会重复,不过保证I<>J,1<=I,J<=n)。1<=N<=2100,0<=m<=N*(N-1), 1<=w<=2100.

Output

输出格式:输出文件包含两个数,分别是最少花费和花费最少的路径的总数.两个不同的最短路方案要求:路径长度相同(均为最短路长度)且至少有一条边不重合。若城市N无法到达则只输出一个(‘No answer’);

Sample Input 1

5 4
1 5 4
1 2 2
2 5 2
4 1 1

Sample Output 1

4 2

Sample Input 2

100 1
1 2 1

Sample Output 2

No answer

最短路+暴力找路径条数
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<cmath> const int maxn=1e5+;
typedef long long ll;
const ll Inf=0x3f3f3f3f3f3f3f;
using namespace std; struct node
{
int to;
ll w;
};
ll map[][];
vector<node>vec[];
int vis1[][];
int vis[];
ll dis[];
int n,m;
void Init ()
{
for(int t=;t<=n;t++)
{
for(int j=;j<=n;j++)
{
map[t][j]=Inf;
}
}
for(int i=;i<=n;i++)
{
map[i][i]=;
}
}
void Getmap()
{
int u,v;
ll w;
for(int t=;t<=m;t++)
{
scanf("%d%d%lld",&u,&v,&w);
if(map[u][v]>w)
map[u][v]=w;
if(vis1[u][v]!=w)
{
node s;
s.to=v;
s.w=w;
vec[u].push_back(s);
}
vis1[u][v]=w;
}
}
void Dijkstra(int u)
{
memset(vis,,sizeof(vis));
for(int t=;t<=n;t++)
{
dis[t]=map[u][t];
}
vis[u]=;
for(int t=;t<n;t++)
{
ll minn=Inf,temp;
for(int i=;i<=n;i++)
{
if(!vis[i]&&dis[i]<minn)
{
minn=dis[i];
temp=i;
}
}
vis[temp]=;
for(int i=;i<=n;i++)
{
if(map[temp][i]+dis[temp]<dis[i])
{
dis[i]=map[temp][i]+dis[temp];
}
}
}
}
ll bfs()
{
ll sss=;
queue<node>q;
for(int t=;t<vec[].size();t++)
{
node nn=vec[][t];
if(nn.w<=dis[n])
q.push(vec[][t]);
}
while(!q.empty())
{
node now=q.front();
q.pop();
if(now.to==n)
{
if(now.w==dis[n])
{
sss++;
}
}
for(int t=;t<vec[now.to].size();t++)
{
node after=vec[now.to][t];
after.to=after.to;
after.w=now.w+after.w;
if(after.w<=dis[n])
q.push(after);
}
}
return sss;
}
int main()
{ scanf("%d%d",&n,&m);
Init();
Getmap();
Dijkstra();
if(dis[n]!=Inf)
{
ll ans=bfs();
printf("%lld %lld\n",dis[n],ans);
}
else
{
printf("No answer\n");
}
return ;
}

最新文章

  1. SQL用先进先出存储过程求出库数量
  2. 用花生壳实现内网映射,决解无域名、无公网IP、无服务器空间问题
  3. k8s volume
  4. hdu 5017 模拟退火
  5. go1.6.2 linux/amd64 的一个bug: gcc: 无法识别的选项&lsquo;-no-pie&rsquo;
  6. Mac OS 10.10 Yosemite正式版怎么升级 升级教程
  7. python with关键字学习
  8. 谈JSON在Ajax中的使用
  9. In-Cell、On-Cell和OGS全贴合屏幕技术区别
  10. Zepto 使用中的一些注意点
  11. 一个&quot;2-SUM&quot;问题
  12. java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)
  13. SpringBoot配置devtools实现热部署
  14. ubuntu 16.04 安装wechat, chrome等
  15. [JavaScript] 前端模块编程实现
  16. 用python 实现一个栈
  17. win10 KMS命令激活步骤&lt;转&gt;
  18. windows 批处理语言学习
  19. Java翻转数组的方法
  20. CSS滚动条样式设置

热门文章

  1. IdentityServer4 (1) 客户端授权模式(Client Credentials)
  2. Android ExpandListView的用法(补上昨天的)(今天自习)
  3. python3.1for循环及应用
  4. MySQL 插入或更新
  5. MyBatisPlus乐观锁,乐观锁竟然如此简单
  6. MixNet:MixConv:Mixed Depthwise Convolution kernels
  7. java基础之字符串
  8. RabbitMQ 基础概念进阶
  9. Java—匿名对象/内部类/访问修饰符/代码块
  10. C#LeetCode刷题之#459-重复的子字符串(Repeated Substring Pattern)