您的位置:首页 > 其它

Poj 1926 Pollution

2011-06-11 15:41 375 查看
//这道题目很简单,矩阵相乘即可,只是在精度上要控制好

//虽然简单却暴露了自己是多么马虎,以此为戒吧 :(

//1.首先是sizeof问题(代码中有标明),2.然后是看题,比如说这组数据:

1
3 2
1
2
0.6
2 3
1 2
它是不能平衡的,,但是题目说一定会保证input数据都能平衡

3.最后就是致命的,,忘了孤立点的事情!,,蛋蛋疼!

#include <iostream>
#include <queue>
#include <stack>
#include <string>
#include <map>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX=105,INF=1<<30;
int n,m,di;
bool g[MAX][MAX];
double tank[MAX],mat[MAX][MAX],odd[MAX][MAX],
       I[MAX][MAX];
int d[MAX];
inline
void mul (double m1[MAX][MAX],double m2[MAX][MAX]){
    double ans[MAX][MAX];
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            ans[i][j]=0;
            for(int k=0;k<n;k++){
                ans[i][j]+=m1[i][k]*m2[k][j];
            }
        }
    }
    memcpy(m1,ans,sizeof(double)*MAX*MAX);//不能sizeof(m1),
                                          //因为它在函数里面只是一个指针
    return ;
}

void Pow(double a[MAX][MAX],int k){
    memcpy(odd,I,sizeof(odd));

    while(k){
        if(k&1) mul(odd,a);
        mul(a,a);
        k>>=1;
    }

    return ;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("i.txt", "r", stdin);
    //freopen("e://t1.txt", "w", stdout);
#endif
    int T,u,v;
    double ans[MAX];
    cin>>T;
    memset(I,0,sizeof(I));
    for(int i=0;i<MAX;i++) I[i][i]=1.0;

    while(T--){
        memset(g,0,sizeof(g));
        memset(d,0,sizeof(d));
        memset(mat,0,sizeof(mat));
        cin>>n>>m;
        for(int i=0;i<n;i++)
            cin>>tank[i];
        for(int i=0;i<m;i++){
            cin>>u>>v;
            --u; --v;
            g[u][v]=1;
            g[v][u]=1;
        }

        for(int i=0;i<n;i++){
            di=0;
            for(int j=0;j<n;j++){
                if(g[i][j])
                    ++di;
            }
            d[i]=di;
            if(!di)
                continue;
            for(int j=0;j<n;j++){
                if(g[i][j]){
                    mat[i][j]=1/(double)di;
                }
            }
        }

        Pow(mat,2*m*m);
        memset(ans,0,sizeof(ans));

        for(int j=0;j<n;j++){
            for(int k=0;k<n;k++){
                ans[j]+=tank[k]*odd[k][j];
            }
        }
        for(int i=0;i<n;i++){
            if(d[i])
                printf("%.3lf/n",ans[i]);
            else
                printf("%.3lf/n",tank[i]);
        }
        printf("/n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: