[題解]luogu_P1144最短路計數



1.無權圖最短路邊權為1

2.如果兩個點恰好不能被更新(d[y]==d[x]+1)那麼就能通過x的所有最短路到達y,所以ans[y]+=ans[x]

3.如果兩個點不能恰好被更新(d[y]>d[x]+1)那麼到達y的最短路目前只有通過x到達,所以ans[y]=ans[x]

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=1000010;
const int maxm=2000010;
const int mod=100003;
int n,m;
int head[maxn],cnt;
struct node{
    int v,nxt;
}e[maxn*2];
void add(int u,int v){
    e[++cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
}
queue<int>q;
int d[maxn],v[maxn],c[maxn];
void spfa(){
    d[1]=0;v[1]=1;q.push(1);
    c[1]=1;//初值
    while(!q.empty()){
        int x=q.front();q.pop();v[x]=0;
        for(int i=head[x];i;i=e[i].nxt){
            int y=e[i].v;
            if(d[y]>d[x]+1){
                d[y]=d[x]+1;
                c[y]=c[x];//覆蓋
                if(!v[y])q.push(y),v[y]=1;
            }
            else if(d[y]==d[x]+1)c[y]+=c[x],c[y]%=mod;//相等就合併
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1,x,y;i<=m;i++){
        scanf("%d%d",&x,&y);
        add(x,y);add(y,x);
    }
    memset(d,0x3f,sizeof(d));
    spfa();
    for(int i=1;i<=n;i++)printf("%d\n",c[i]);
}

原文地址:https://www.cnblogs.com/superminivan/p/10713331.html

时间: 2024-10-07 20:36:44

[題解]luogu_P1144最短路計數的相关文章

DevExpress的GridControl控件更新數據問題解決辦法

開發WPF程序時,使用Devexpress的GridControl控件用ItemSource綁定數據,在頁面進行編輯時,當屬性繼承INotifyPropertyChanged接口時會同步更新後臺數據.今天在開發時遇到一種情況,當通過GridControl中Row上Button[Command]改變行內數據,也就是binding的Detail數據已改變,這時NotifyPropertyChanged有觸發,但改變的行數據不會同步更新到UI上,目前測試有兩種方式進行解決. 1.直接new 一個新的行

[題解](水/數學)luogu_P1147連續自然數和

尺取法a掉 然而數學解法為 等差數列求和公式: sum(L,R)=(L+R)(R-L+1)/2=M 即(L+R)(R-L+1)=2M 可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1<K2时, 可以列一个二元一次方程组 R-L+1=K1 L+R=K2 解得L=(K2-K1+1)/2, R=(K1+K2-1)/2 当K1,K2一奇一偶时,L,R才有自然数解. 不过有一种特殊情况,就是L=R的情况,这种情况是不允许的 即(K2-K1+1)/2≠(K1+K2-1)/2,解得K1≠1 尺取

[題解](二分答案/單調隊列)luogu_P1419尋找段落

果然又抄的題解... 顯然答案具有單調性,而對于平均數計算的式子我們移一下項, 若s[l..r]>mid*(r-l+1)无解, 於是我們把每個數都減去一個mid,看和的正負即可,如果為正就可能有更大的平均數, 求子串和最大值可以用單調隊列維護, #include<bits/stdc++.h> using namespace std; const int maxn=100010; int n,s,t; double a[maxn],sum[maxn]; int b[maxn],q[maxn

[題解](貪心/堆)luogu_P2107小Z的AK計劃

清明講過一道類似的,難度略大的:P3545 [POI2012]HUR-Warehouse Store 兩道題類似,都是暫時先把前面的加進候選集合里,如果超出限制的話就拿現在這個和前面的交換, 相當於不選前面那個選當前這個,應該是比較好的思想 這道題還有一個就是如果最優解要你走到那個點,那麼中間的路程是不可省略的,所以貪心時大可不考慮 反正實質上是個dp,取的是最大值 #include<bits/stdc++.h> #define ll long long using namespace std

統計數字(2007年NOIP全国联赛提高组)

题目描述 Description [问题描述]某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 输入描述 Input Description 第1行是整数n,表示自然数的个数.第2~n+1 行每行一个自然数. 输出描述 Output Description 输出包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出.每行输出两个

ASP.NET MVC Identity 兩個多個連接字符串問題解決一例

按照ASP.NET MVC Identity建立了一個用戶權限管理模塊,由于還要加自己已有的數據庫,所以建立了一個實體模型,建立了之后,發現登錄不了: 一直顯示"Login in failed for user 'sa',後來發現不是用戶名和密碼不對,而是連接字符串的問題,按屬性里複製的連接字符串沒有包括Initial Catalog=MISWeb, 所以有時正常,有時提示登錄錯誤. 多個連接字符串ConnectionString可以同時存在.包括同一服務器,同一用戶名,同一數據庫.

[題解/考試]國王飲水記

前言:今日又考試了,一道斐波那契的入門題因為沒有特判0錯了一個點,兩道不會,結果連rk7.8都沒拿到, 前天把鉛筆盒丟掉了,裡面有筆,耳機和U盤.U盤裡有做過的題,一些模板,寒假講的東西和課件,6個遊戲,一些安裝包和一些網址. 發現丟掉以後就變得特別絕望,極度悲傷,可是這就是命運啊,你不接受那就去死好了. 人活著本來就沒有什麼意義可言,尋找意義自然也是不可能尋找到的了. 意義什麼的都是小孩子的事情,所以只能這樣活著了. 與其如此那還不如把U盤裡的東西裝到腦子裡,也不必擔心什麼了. n個點,按順序

[題解](狀壓/水)luogu_P1879玉米田

大水題然而因為智障的錯誤调了半天......n,m别反着输入啊......內外循環和狀態數都不等價 别的就是記錄一下每一行不可行的點,也狀壓一下,dp的時候判一下即可 #include<bits/stdc++.h> using namespace std; const int mod=100000000; int n,m,tot; int f[15][1<<12+1],c[1<<12+1]; int can[15]; int main() { scanf("%

[題解]51nod_1515_明辨是非

好久沒有話多了,是覺得有點浪費時間,今天考試和一中用的一樣的題,結果反而考得不好,不過Jackpei一句知恥而後勇點醒夢中人偷偷@Jackpei 就是這樣吧 還有我極度懷疑我的鍵帽打油了......我買了假的PBT還是我的手實在是太油了...... 強制在線,因為不等關係沒有傳遞性,於是用set維護不等關係,并查集維護相等關係, 合併時把set也合併掉,具體就是直接複製合併,複雜度可以接受,雖然並不會算 於是大力瞎搞,我調了半天錯在了合併set搞錯了,it本來就是s[xx]的迭代器,怎麼能和自己