1/*2*題目大意:
3*在乙個有向圖中,求從s到t兩個點之間的最短路和比最短路長1的次短路的條數之和; 4*
5*演算法思想:
6*用a*求第k短路,目測會超時,直接在dijkstra演算法上求次短路;
7*將dist陣列開成二維的,即dist[v][2],第二維分別用於記錄最短路和次短路;
8*再用乙個cnt二維陣列分別記錄最短路和次短路的條數;
9*每次更新路徑的條數時,不能直接加1,,應該加上cnt[u][k],k為次短路徑或者最短路徑的標記;
10*圖有重邊,不能用鄰接矩陣儲存;
11*不知道為什麼,題目上說的是n and m, separated by a single space, with 2≤n≤1000 and 1 ≤ m ≤ 10000;
12*而我的**硬是把n開成1w了才過,求解釋,re了無數次,擦; 13*
*/14 #include
15 #include
16 #include
17 #include
18 #include
19using
namespace
std;
2021
const
int n=11111
; 22
const
int m=111111
; 23
const
int inf=0xffffff
; 24
25struct
node
26;
3132
node edge[n];
33int
head[n];
3435
int dist[n][2],cnt[n][2
];
36bool vis[n][2
];
37int
n,m,s,t,edges;
3839
void addedge(int u,int v,int
w)
40
4647
intdijkstra()
48
56 cnt[s][0]=1,dist[s][0]=0
; 57
58for(int i=1; i<=n*2; i++)
59
70if(u==-1
) 71
break
; 72 vis[u][k]=true
; 73
for(int e=head[u]; e!=-1; e=edge[e].next)
74
8586
else
if(tmp==dist[j][0])//
tmp等於最短路徑長:
87
9091
else
if(tmp1])//
tmp大於最短路徑長且小於次短路徑長:
92
9697
else
if(tmp==dist[j][1])//
tmp等於次短路徑長:
98
101}
102}
103104
int res=cnt[t][0
];
105if(dist[t][0]+1==dist[t][1])//
判斷最短路和次短路是否相差1
106 res+=cnt[t][1
];
107return
res;
108}
109110
intmain()
111
126 scanf("
%d%d
",&s,&t);
127 printf("
%d\n
",dijkstra());
128}
129return
0;
130 }
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...
最短路與次短路計數
poj 3464 問最短路的條數 比最短路權值大 1 的條數 做法 比較一下次短路和最短路的值 若次短路恰好比最短路大1,答案為最短路 次短路條數,否則答案就是最短路條數 1 include2 const int inf 0x3f3f3f3f 3 class count short path e m...
計算最短路和次短路條數
題目 題意 在給定有向圖中查詢最短路與次短路,如果 最短路 1 次短路 則輸出 最短路條數 次短路條數 否則只輸出最短路條數。思路 在最短路的鬆弛操作上做些判斷和記錄即可,具體看 吧 有注釋 include include include include include include includ...