日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ssl1257-产生数【图论,最短路】

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ssl1257-产生数【图论,最短路】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

給出一個整數 n(n<10^30) 和 k 個變換規則(k<=15)。
  規則:
   一位數可變換成另一個一位數:
   規則的右部不能為零。
  例如:n=234。有規則(k=2):
    2-> 5
    3-> 6
  上面的整數 234 經過變換后可能產生出的整數為(包括原數):
   234
   534
   264
   564
  共 4 種不同的產生數
問題:
  給出一個整數 n 和 k 個規則。
求出:
  經過任意次的變換(0次或多次),能產生出多少個不同整數。
  僅要求輸出個數。

輸入

鍵盤輸人,格式為:
  n k
  x1 y1
  x2 y2
  … …
  xk yk
  
234 2
2 5
3 6

輸出

一個整數(滿足條件的個數):
4


解題思路

用way[i][j]表示是否可以從數字i變為數字j。然后用Floyd算法計算數字互相轉換,然后每個數字的方式乘起來(要用高精)。


代碼

#include<cstdio> #include<cstring> using namespace std; char s[41]; short a[41]; int k,x,y,way[10][10],n,f[10]; void add(int x)//高精乘 {int g=0;for (int i=1;i<=40;i++){a[i]=a[i]*x+g;g=a[i]/10;a[i]%=10;} } void write()//高精輸出 {int x=40;while (a[x]==0) x--;for (int i=x;i>=1;i--) printf("%d",a[i]); } int main() {scanf("%s %d\n",s,&k);n=strlen(s);//數字長度for (int i=1;i<=k;i++){scanf("%d%d",&x,&y);way[x][y]=true;//表示可以從x變為y}for (int k=0;k<=9;k++)for (int i=0;i<=9;i++)for (int j=0;j<=9;j++)way[i][j]=(way[i][j] or way[i][k] and way[k][j]);//計算是否可以經過k從i變為jfor (int i=0;i<=9;i++){for (int j=0;j<=9;j++)if (i!=j && way[i][j]) f[i]++;f[i]++;//計算該數字的變化方式} a[1]=1;for (int i=0;i<n;i++){add(f[s[i]-48]);//乘}write();//輸出 }

總結

以上是生活随笔為你收集整理的ssl1257-产生数【图论,最短路】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。