1. 程式人生 > >qdu-小明的貪心題(最短路+最短路的數量 )

qdu-小明的貪心題(最短路+最短路的數量 )

answer 一個 ios 重復 front lse 兩個 init amp

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+5;
typedef long long ll;
const ll Inf=0x3f3f3f3f3f3f3f;
using namespace std; struct node { int to; ll w; }; ll map[2105][2105]; vector<node>vec[2105]; int vis1[2105][2105]; int vis[2105]; ll dis[2105]; int n,m; void Init () { for(int t=1;t<=n;t++) { for(int j=1;j<=n;j++) { map[t][j]=Inf; } } for(int i=1;i<=n;i++) { map[i][i]=0; } } void Getmap() { int u,v; ll w; for(int t=1;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,0,sizeof(vis)); for(int t=1;t<=n;t++) { dis[t]=map[u][t]; } vis[u]=1; for(int t=1;t<n;t++) { ll minn=Inf,temp; for(int i=1;i<=n;i++) { if(!vis[i]&&dis[i]<minn) { minn=dis[i]; temp=i; } } vis[temp]=1; for(int i=1;i<=n;i++) { if(map[temp][i]+dis[temp]<dis[i]) { dis[i]=map[temp][i]+dis[temp]; } } } } ll bfs() { ll sss=0; queue<node>q; for(int t=0;t<vec[1].size();t++) { node nn=vec[1][t]; if(nn.w<=dis[n]) q.push(vec[1][t]); } while(!q.empty()) { node now=q.front(); q.pop(); if(now.to==n) { if(now.w==dis[n]) { sss++; } } for(int t=0;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(1); if(dis[n]!=Inf) { ll ans=bfs(); printf("%lld %lld\n",dis[n],ans); } else { printf("No answer\n"); } return 0; }

qdu-小明的貪心題(最短路+最短路的數量 )