51nod 1610 路徑計數

2021-08-07 13:29:28 字數 2336 閱讀 3659

原題連線:

考慮不同權重為

d 的倍數的邊組成的圖.f(

d)為此圖中。路徑總數量。由於m

≤50000

.明顯會出現重邊。

建議限制邊的數量或者使用鄰接矩陣存圖。

矩陣更為方便。

由於最初沒有考邊過多。使用了鍊錶+拓撲排序。**量較大。

#include 

#include

#include

#include

#define maxm 50210

#define maxn 105

using

namespace

std;

typedef

long

long ll;

const

int p=1e9+7;

const

int p_=p-1;

struct io

void io_fread()

bool read(int &a)//返回false表示什麼也沒讀到

}a=0;

while(*ptop>l&&*ptop10+(*(ptop++)-'0');

if(ptop==pend) io_fread();

}return

true;

}}i;struct node

node()

}g[maxm];//返圖。方便topsort

struct edge

; edge(int to,int w,int l,int r):to(to),w(w),l(l),r(r){}

edge()

}e[maxn][20000];

vector

v[maxn];

int ginof[maxn];

int inof[maxn][maxn];

int mu[maxn]=,out[maxn],ans[maxn],dp[maxn];

int f[maxm][3],f2[maxm][3];

int name[maxn][maxn];

void add(edge &e,int deep)

void build(int t,int deep)//將deep調邊錄入t集合內

int &d=inof[t][e.from];

e.l=e[t][d].l;

e.r=d;

e[t][e[t][d].l].r=deep;

e[t][d].l=deep;

}void remove(int t,int deep)//刪除

int q[maxn],a[maxn];

void topsort(int n);

int slove(int d,int n);//d倍數權重的圖上計算邊數;

int clat();

int main ()

int &d=f[i][2],&b=name[f[i][0]][f[i][1]];

for(int j=0;j<(int)v[d].size();j++)

add(e[d][b],i);

}topsort(n);

for(int i=1;i<101;i++)ans[i]=slove(i,n);

int ans=clat();

printf("%d\n",ans);

i.read(t);

while(t--)

for(int i=0;iint d=v[y][i];

build(d,x);

}for(int j=1;jint &i=v[y][j];

ans-=mu[i]*ans[i];

if(ans<0)ans+=p;

if(ans>p_)ans-=p;

ans[i]=slove(i,n);

ans+=mu[i]*ans[i];

if(ans<0)ans+=p;

if(ans>p_)ans-=p;

}for(int j=1;jint &i=v[w][j];

if(y%i)

}printf("%d\n",ans);

}return0;}

void topsort(int n)

while(lint v=q[l++];

a[n--]=v;

for(int i=ginof[v];i;i=g[i].next)

}}int slove(int d,int n)

tmp+=dp[v];

if(tmp>p_)tmp-=p;

}return tmp;

}int clat()

return tmp;

}

51nod 1776 路徑計數

我們先把前兩種數給排好,排好之後會有 a b 1 個空隙可以填數,我們計算有 k 個空隙兩端都是相同字母的方案數 可以用列舉把第二種數分成幾段插進去來算,設這個方案數為 f k 然後對於一種有 k 個空隙的方案數,列舉剩下的 a b 1 k 個空隙填了 h 個 然後計算把 c 和 d 分成 k h ...

51Nod1967 路徑定向

給出乙個有向圖,要求給每條邊重定向,使得定向後出度等於入度的點最多,輸出答案和任意一種方案 input 第一行兩個正整數n,m,表示1 n號點與m條邊 接下來m行,每行兩個正整數xi,yi,表示存在一條有向邊從xi指向yi n 10 5,m 3 10 5,xi,yi n output 第一行乙個整數...

51NOD 1967 路徑定向

給出乙個有向圖,要求給每條邊重定向,使得定向後出度等於入度的點最多,輸出答案和任意一種方案.n 10 5,m 3 10 5,xi,yi n 考慮先當每條邊雙向。如果這個圖的所有點的度都是偶數,那麼尤拉路徑跑一下就行了 考慮度為奇數的點 連線所有度為奇數的點,使其成為偶數點,顯然不會影響正確性 留個坑...