1. 程式人生 > >luogu P1608 路徑統計

luogu P1608 路徑統計

num rdquo namespace 自己 準備 pty node 問題: else

題目描述

“RP餐廳”的員工素質就是不一般,在齊刷刷的算出同一個電話號碼之後,就準備讓HZH,TZY去送快餐了,他們將自己居住的城市畫了一張地圖,已知在他們的地圖上,有N個地方,而且他們目前處在標註為“1”的小鎮上,而送餐的地點在標註為“N”的小鎮。(有點廢話)除此之外還知道這些道路都是單向的,從小鎮I到J需要花費D[I,J]的時間,為了更高效快捷的將快餐送到顧客手中,

他們想走一條從小鎮1到小鎮N花費最少的一條路,但是他們臨出發前,撞到因為在路上堵車而生氣的FYY,深受啟發,不能僅知道一條路線,萬一。。。,於是,他們邀請FYY一起來研究起了下一個問題:這個最少花費的路徑有多少條?

輸入輸出格式

輸入格式:

輸入文件第一行為兩個空格隔開的數N,E,表示這張地圖裏有多少個小鎮及有多少邊的信息。

下面E行,每行三個數I、J、C,表示從I小鎮到J小鎮有道路相連且花費為C.(註意,數據提供的邊信息可能會重復,不過保證I<>J,1<=I,J<=n)。

輸出格式:

輸出文件包含兩個數,分別是最少花費和花費最少的路徑的總數.

兩個不同的最短路方案要求:路徑長度相同(均為最短路長度)且至少有一條邊不重合。

若城市N無法到達則只輸出一個(‘No answer’);

輸入輸出樣例

輸入樣例#1:
5 4
1 5 4
1 2 2
2 5 2
4 1 1
輸出樣例#1:
4 2

說明

對於30%的數據 N<=20;

對於100%的數據 1<=N<=2000,0<=E<=N*(N-1), 1<=C<=10.

數據有重復,註意判重

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N = 2200;
int head[N];
struct node{
    int v,w,next;
}edge[N
*N/2]; int n,e,num=0,dis[N];bool vis[N]; void add_edge(int x,int y,int z) { edge[++num].v=y;edge[num].w=z;edge[num].next=head[x];head[x]=num; } int ans1,cnt[N]; int minn=0; void spfa(int x) { queue<int>que; vis[1]=1;dis[1]=0;cnt[1]=1; que.push(1); while(!que.empty()) { int u=que.front();que.pop(); if(u==n)continue; for(int i=head[u];i;i=edge[i].next) { int v=edge[i].v; if(dis[u]+edge[i].w<dis[v]) { if(dis[u]+edge[i].w<dis[v]) { dis[v]=dis[x]+edge[i].w; cnt[v]=cnt[u]; } if(!vis[v])que.push(v),vis[v]=1; } else if(dis[u]+edge[i].w==dis[v]) cnt[v]+=cnt[u]; } vis[u]=0;cnt[u]=0; } } int main() { memset(dis,0x3f,sizeof dis); scanf("%d%d",&n,&e); int a,b,c; for(int i=1;i<=e;i++) { scanf("%d%d%d",&a,&b,&c); add_edge(a,b,c); } spfa(1); if(dis[n]==0x3f3f3f3f) puts("No Answer"); else printf("%d %d\n",dis[n],cnt[n]); return 0; }

luogu P1608 路徑統計