寻找路径数目

来源:互联网 发布:南京软件科技大学 筹 编辑:程序博客网 时间:2024/06/06 08:38

题意输入包含多个测试用例输入0退出测试。吉米将每个十字路口或加入的路径从1开始编号。他的办公室是编号1,他的房子是编号2。每个测试用例的第一行是十字路口的数量N,1 < N≤1000,和路径数量的M。接下来的M行线每个包含路口a、b和整数距离1≤d≤1000000表示的道路长度d。吉米可以走任何他选择的道路。任一对十字路口之间最多有一个路径

思路:建map数组,应用深度优先搜索找出路径条数。

#include<iostream> #include<queue> using namespace std; typedef struct n1 {     int  distens,flog; }node; node N[1005]; int map[1005][1005],k; int direct[1005]; void set(int n) {     int i,j,m,n1,n2,d;     for(i=1;i<=n;i++)     {         for(j=1;j<=n;j++)         {             map[i][j]=-1;         }          N[i].distens=10000000;N[i].flog=0;direct[i]=0;     }       cin>>m;     while(m--)     {         cin>>n1>>n2>>d;         if(map[n1][n2]!=0||map[n1][n2]>d)         map[n1][n2]=map[n2][n1]=d;     } } void spfa(int n) {     queue<int> Q;     int now;     int i;      N[2].distens=0;N[2].flog=1;     Q.push(2);     while(!Q.empty())     {         now=Q.front();         Q.pop();         N[now].flog=0;         //if(q.x==1)break;         for(i=1;i<=n;i++)         if(map[now][i]!=-1)         {             if(N[i].distens>N[now].distens+map[now][i])             {                 N[i].distens=N[now].distens+map[now][i];                 if(N[i].flog==0)                 {                     N[i].flog=1;                     Q.push(i);                 }             }         }     } } int DFS(int now,int n) {     int i;     if(direct[now]>0)     return direct[now];     if(now==2)     {         return 1;     }     for(i=1;i<=n;i++)     if(map[now][i]!=-1&&N[now].distens>N[i].distens)     {         direct[now]+=DFS(i,n);     }      return direct[now]; } int main() {     int n;     while(cin>>n&&n)     {         set(n);         spfa(n);         k=DFS(1,n);       cout<<k<<endl;     } }

0 0
原创粉丝点击