HDU 6026 Deleting Edges

Posted zz990728

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6026 Deleting Edges相关的知识,希望对你有一定的参考价值。

题目: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的主要内容,如果未能解决你的问题,请参考以下文章

hdu 6026 Deleting Edges 江苏徐州邀请赛K

2017中国大学生程序设计竞赛 - 女生专场 Deleting Edges(思维+最短路)

HDU 3094 A tree game

Tree and Permutation dfs hdu 6446

hdu 5606 tree(并查集)

为什么不使用G.add_edges_from()添加边缘,匹配G.edges()?