HDU6026(最短路)

来源:互联网 发布:知柏地黄丸女童能吃吗 编辑:程序博客网 时间:2024/06/08 02:40

Deleting Edges

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 479 Accepted Submission(s): 166

Problem Description
Little Q is crazy about graph theory, and now he creates a game about graphs and trees.
There is a bi-directional graph with n nodes, labeled from 0 to n−1. Every edge has its length, which is a positive integer ranged from 1 to 9.
Now, Little Q wants to delete some edges (or delete nothing) in the graph to get a new graph, which satisfies the following requirements:
(1) The new graph is a tree with n−1 edges.
(2) For every vertice v(0

#include<bits/stdc++.h>using namespace std;typedef long long ll;ll mod = 1e9 + 7;const int inf = 1e9;const int maxn = 100;int n;int Matrix[maxn][maxn];char s[maxn][maxn];int dis[maxn];int num[maxn];struct node{    int v;    int d;    bool operator < (const node &nx) const {        return nx.d > d;    }};void Dijkstra(){    priority_queue<node> Q;    for(int i = 1; i <= n; i++) dis[i] = inf;    memset(num, 0, sizeof(num));    node n0, nx, ans;    n0.v = 1;    n0.d = 0;    Q.push(n0);    dis[1] = 0;    while(!Q.empty())    {        nx = Q.top();        Q.pop();        int v = nx.v;        int d = nx.d;        if(d > dis[v]) continue;        for(int i = 1; i <= n; i++)        {            if(Matrix[v][i] && dis[i] > dis[v] + Matrix[v][i])            {                dis[i] = dis[v] + Matrix[v][i];                ans.v = i;                ans.d = dis[i];                Q.push(ans);            }        }    }}int main(){    while(~scanf("%d", &n))    {        for(int i = 1; i <= n; i++)        {            scanf("%s", s[i] + 1);            for(int j = 1; j <= n; j++)            {                Matrix[i][j] = s[i][j] - '0';            }        }        Dijkstra();        for(int i = 2; i <= n; i++)        {            ll res = 0;            for(int j = 1; j <= n; j++)            {                if(i != j)                {                    if(dis[j] + Matrix[j][i] == dis[i] && Matrix[j][i]) res++;                }            }            num[i] = res;        }        ll ans = 1;        for(int i = 2; i <= n; i++)        {           ans = (ans * num[i]) % mod;        }        printf("%lld\n", ans);    }    return 0;}