luogu P1608 路徑統計
阿新 • • 發佈:2017-07-11
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 路徑統計