這道題先跑乙個最短路,然後在用記憶化搜尋搜出最短路條數。
開乙個$dis$陣列存最短路長度,開乙個$ans$陣列存答案。
搜到乙個節點$v$,尋找它能到達的每個節點$u$,如果$dis[u]+1==dis[v]$,說明用最短路的走法走到$u$後,直接走到$v$就都是$1$到$v$的一條合法最短路。
此時,$ans[v]=ans[u]+ans[v]$.
寫記憶化搜尋的時候,不要算過了還遞迴進去再返回,那樣會tle。
此外,把記憶化放進輸出是乙個很巧的方法。
#include#define n 1000010
#define m 2000010
#define mod 100003
#define inf 0x3f3f3f3f
using namespace std;
int n,m,cnt;
int head[m],dis[n],ans[n];
bool vis[n];
struct node e[m*2];
void addedge(int u,int v) ;
head[u]=cnt;
return;
}void read()
return;
}void init()
return;
}void spfa()
} }return;
}int calc(int x)
} return ans[x];
}void print()
return;
}int main()
luogu P1144 最短路計數
給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入格式 輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出格式 輸出包括n行,每行乙個非負整數,第i行輸...
Luogu P1144 最短路計數
給出乙個n個頂點m條邊的無向無權圖,頂點編號為1 n。問從頂點1開始,到其他每個點的最短路有幾條。輸入格式 輸入第一行包含2個正整數n,m,為圖的頂點數與邊數。接下來m行,每行兩個正整數x,y,表示有一條頂點x連向頂點y的邊,請注意可能有自環與重邊。輸出格式 輸出包括n行,每行乙個非負整數,第i行輸...
C P1144 最短路計數
題目 p1144 最短路計數 他們居然說是水題,看來我還是太low了。用spfa求最短路,然後記錄有多少個相同的到該點的最短路。你忽略了重邊了嗎?include include include using namespace std const int maxn 0x7fffffff 3 int n...