首页 > 其他 > 详细

!(取模问题)LOJ10064 黑暗城堡

时间:2019-10-13 11:06:40      阅读:122      评论:0      收藏:0      [点我收藏+]

题目描述

你知道黑暗城堡有  个房间, 条可以制造的双向通道,以及每条通道的长度。

城堡是树形的并且满足下面的条件:

设  为如果所有的通道都被修建,第  号房间与第  号房间的最短路径长度;

而  为实际修建的树形城堡中第  号房间与第  号房间的路径长度;

要求对于所有整数  (),有  成立。

你想知道有多少种不同的城堡修建方案。当然,你只需要输出答案对  取模之后的结果就行了。

输入格式

第一行为两个由空格隔开的整数 ;

第二行到第  行为  个由空格隔开的整数 :表示  号房间与  号房间之间的通道长度为 

输出格式

一个整数:不同的城堡修建方案数对  取模之后的结果。

样例

样例输入

4 6
1 2 1
1 3 2
1 4 3
2 3 1
2 4 2
3 4 1

样例输出

6
技术分享图片

1.

if ((d[j] < min) && (d[j] > pre)) {//d可能存在多个相等的 取了其中一个就把pre更新为d 导致后面相等的d无法取到

当时懒得重新初始化v

if ((d[j]<min)&&(!v[j])) {min=d[j];k=j;}

2.

取模问题

不强制类型转化?强制类型转化不是把位数高的转化为位数低的?即ll转为int

只要ans in p中有一个为ll 且%p 即AC

ll ans in p

ans = ans * in % p;

ll  ans; int in,p;

ans ans in p;

int ans;ll in,p;

ans ans in p;

https://loj.ac/submission/636255

测试点10输出0 溢出

ll ans in 

ans ans in;

https://loj.ac/submission/636259

int ans,in

ans=ans*in

https://loj.ac/submission/636264

int ans,in,p

ans=ans*in%p

 

AC

#include<bits/stdc++.h>//sort依据结构体里一个元素的大小进行排序 
#define inf 0x3f3f3f3f//3f 
#define ll long long
//typedef  long long ll;
using namespace std;
const ll p=(1LL<<31)-1;
int n,m,d[1005],id[1005],v[1005],e[1005][1005];
void dist(){
  memset(d,0x3f,sizeof(d));
  d[1]=0;
  for(int i=2;i<=n;i++)d[i]=e[1][i];
  for(int i=1;i<n;i++){
        int min=inf,k;
        for(int j=2;j<=n;j++) if ((d[j]<min)&&(!v[j])) {min=d[j];k=j;}
        v[k]=1;
        for(int j=2;j<=n;j++) 
        if ((!v[j])&&d[j]>d[k]+e[k][j]) d[j]=d[k]+e[k][j];
  }            
}

int main(){
    scanf("%d%d",&n,&m);
    memset(e,0x3f,sizeof(e));
    for(int i=1;i<=m;++i){
        int x,y,c;
        cin>>x>>y>>c;
        e[x][y]=c;
        e[y][x]=c;
    }
    dist();
    //for(int i=1;i<=n;i++) cout<<d[i]<<endl;
    int k,min=inf,pre=0;
    ll ans=1;
    memset(v,0,sizeof(v));
    for(int i=0;i<n-1;i++){
        ll in=0;
        if (i) pre=min;
        min=inf;//漏了 
        for (int j=2;j<=n;j++)
        if ((d[j]<min)&&(!v[j])) {min=d[j];k=j;}//d[j]>pre 可能存在多个相等的 
        //cout<<k<<endl;
        v[k]=1;
        for (int j=1;j<=n;j++)
        if (d[k]==d[j]+e[j][k]) in++;//(d[j]<=pre)&&
        ans=ans*in%p;//取模问题 
        
            }
    cout<<ans;
    return 0;}
 

 

WA 30分

#include <bits/stdc++.h>  
#define inf 0x3f3f3f3f    // 3f
#define ll long long
// typedef  long long ll;
using namespace std;
const int p = (1LL << 31) - 1;
int n, m, d[1005], id[1005], v[1005], e[1005][1005];
void dist() {
    memset(d, 0x3f, sizeof(d));
    d[1] = 0;
    for (int i = 2; i <= n; i++) d[i] = e[1][i];
    for (int i = 1; i < n; i++) {
        int min = inf, k;
        for (int j = 2; j <= n; j++)
            if ((d[j] < min) && (!v[j])) {
                min = d[j];
                k = j;
            }
        v[k] = 1;
        for (int j = 2; j <= n; j++)
            if ((!v[j]) && d[j] > d[k] + e[k][j])
                d[j] = d[k] + e[k][j];
    }
}

int main() {
    scanf("%d%d", &n, &m);
    memset(e, 0x3f, sizeof(e));
    for (int i = 1; i <= m; ++i) {
        int x, y, c;
        cin >> x >> y >> c;
        e[x][y] = c;
        e[y][x] = c;
    }
    dist();
    // for(int i=1;i<=n;i++) cout<<d[i]<<endl;
    int k, min = inf, pre = 0;
    ll ans = 1;
    for (int i = 0; i < n - 1; i++) {
        int in = 0;
        if (i)
            pre = min;
        min = inf;  //漏了
        for (int j = 2; j <= n; j++)
            if ((d[j] < min) && (d[j] > pre)) {
                min = d[j];
                k = j;
            }
        // cout<<k<<endl;
        for (int j = 1; j <= n; j++)
            if (d[k] == d[j] + e[j][k])
                in++;        //(d[j]<=pre)&&
        ans = ans * in % p;  //取模问题
    }
cout
<< ans; return 0; }

 

 

 

 

 

!(取模问题)LOJ10064 黑暗城堡

原文:https://www.cnblogs.com/wyh447154317/p/11665403.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!