最短路径-Deleting Edges-hdu6026

来源:互联网 发布:ptgui 控制点优化 编辑:程序博客网 时间:2024/06/07 01:56

我们发现一个事情,那就是如果在图中求最短路的话,那么边的数目也是n-1,(纪念我以为是mst的蠢蠢的直觉)。
给定你一个图,可以删除一条边,然后让这个图的所有点距离1的最短路径都不变,问你最多有几种情况
1 方法,统计每个点可以达到最短路的入度值,然后相乘,就好了
2 我开始用的spfa,在中间加一个定义,但这是不对的,因为可能出现相等但并不是最短路。
等一个点出栈后,在遍历后面的点的时候也可能入栈,(层次高但是路径近,可能中间出现了一次相等,但是并不是最短的路径哦,还是跑完判断比较好,)
3 另外我还看了大神的其他解法,直接在矩阵上。。。

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>const int maxn=220;const long long mod=1e9+7;using namespace std;typedef long long ll;struct Node{   int v,w;     Node(){}     Node(int _a,int _b){v=_a;w=_b;}};vector<Node> G[maxn];void add(int a,int b,int c){   G[a].push_back(Node(b,c));}int d[maxn];ll all[maxn];int m;void   spfa(){   queue<int>q;    bool vis[maxn];    for(int i=0;i<maxn;i++)          d[i]=0x7fffffff;    memset(vis,false,sizeof(vis));    q.push(1);    d[1]=0;    while(!q.empty())    {    int u=q.front();          q.pop();          vis[u]=false;       for(int i=0;i<G[u].size();i++)       {   Node s=G[u][i];       if(d[s.v]>=d[u]+s.w)       {          d[s.v]=d[u]+s.w;           if(!vis[s.v])            {  vis[s.v]=true;                q.push(s.v);            }       }       }    }}int main(){  char s[maxn][maxn];   char c;    while(~scanf("%d",&m))    {   for(int i=0;i<maxn;i++)        G[i].clear();        memset(all,0,sizeof(all));        getchar();        for(int i=1;i<=m;i++)         {   for(int j=1;j<=m;j++)              {   c=getchar();                   s[i][j]=c;                 if(c!='0')                    add(i,j,c-'0');              }             getchar();         }         spfa();         ll in[maxn];         memset(in,0,sizeof(in));     for(int i=1;i<=m;i++)        for(int j=1;j<=m;j++)     {  if(i==j) continue;        if(s[i][j]=='0') continue;        if(s[i][j]-'0'+d[i]==d[j])          in[j]++;     }     ll sum=1;     for(int i=1;i<=m;i++)     { if(in[i]!=0)        {sum*=in[i];        sum=sum%mod;}     }   cout<<sum<<endl;    }    return 0;}
0 0
原创粉丝点击