码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 6026 Deleting Edges

时间:2018-04-29 15:19:34      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:计算   namespace   ace   turn   pre   col   eof   main   long   

题目:http://acm.hdu.edu.cn/showproblem.php?pid=6026

题意:给出一个图,要求删除一些边,然后使得删除后的图是一颗树,并且各个点到0点的距离为原来图中的最短距离。

解法:Dijstra算出每个点到原点的距离,然后枚举每个点,计算它的临点到他的距离为它本身的最短距离数目,相乘即可

AC:

#include <iostream>
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;

typedef long long ll;
const int MOD=1e9+7;
ll n, dist[110], vis[110], a[110][110];
char b[110][110];

void dijkstra()
{
    for(int i = 0; i < n; i++){
        dist[i] = INF;
    }
    dist[0]=0;
    for(int i = 0; i < n; i++){
        ll mini = INF, k=-1;
        for(int j = 0; j < n; j++){
            if(!vis[j]&&dist[j]<mini){
                mini = dist[j];
                k = j;
            }
        }
        vis[k] = 1;
        for(int j = 0; j < n; j++){
            if(!vis[j]&&a[k][j]&&dist[j] > dist[k]+a[k][j]){
                dist[j] = dist[k]+a[k][j];
            }
        }
    }
}

int main()
{
    while(cin >> n)
    {
        memset(vis,0,sizeof(vis));
        for(int i = 0; i < n; i++){
            cin >> b[i];
            for(int j = 0; j < n; j++){
                a[i][j] = b[i][j]-0;
            }
        }
        dijkstra();
         ll tmp, ans=1;
        for(int i = 1; i < n; i++){
            tmp = 0;
            for(int j = 0; j < n; j++){
                if(a[j][i]&&dist[i] == dist[j]+a[j][i]){
                    tmp++;
                }
            }
            ans = (ans*tmp)%MOD;
        }
        cout << ans << endl;

    }
    return 0;
}

 

HDU 6026 Deleting Edges

标签:计算   namespace   ace   turn   pre   col   eof   main   long   

原文地址:https://www.cnblogs.com/zz990728/p/8970963.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!