계속 오답이 뜨네요...
제가 한 방법은
1. 다익스트라 알고리즘으로 각 노드 별로 최단거리를 구한다.
2. 최단거리 정보를 이용해 재귀를 돌려서 1번 노드로부터 i번노드까지 최단거리 경로 갯수와 V번 노드로부터 i번 노드까지 최단거리 경로 갯수를 각각 d2, d1에 저장한다.
3. i번 노드를 지나가는 경로 개수는 d1[i-1]*d2[i-1]이고, 총 최단거리 경로 갯수는 d10이다. 기약분수로 바꿔서 출력한다.
알고리즘에 이상이 있나요?
#include <cstdio>#include <vector>#include <queue>#include <functional>#define INF 987654321usingnamespacestd;vector<vector<pair<int,int>>>G;priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>Q;constintMAX=111;intdist[MAX];intdfs1(intindex,int*d1){//메모이제이션if(d1[index]!=-1)returnd1[index];ints=0;for(inti=0;i<G[index].size();i++)// 현재 노드까지의 최단거리랑, 인접한 노드의 최단거리+인접한노드에서 현재 노드 사이의 거리가 같으면 최단경로에 포함되는 길이다. 재귀호출하여 경우의 수에 더해준다.if(dist[G[index][i].second]==dist[index]+G[index][i].first)s+=dfs1(G[index][i].second,d1);d1[index]=s;returns;}intdfs2(intindex,int*d2){if(d2[index]!=-1)returnd2[index];ints=0;for(inti=0;i<G[index].size();i++)if(dist[G[index][i].second]==dist[index]-G[index][i].first)s+=dfs2(G[index][i].second,d2);d2[index]=s;returns;}intgcd(inta,intb){if(a==0)returnb;returngcd(b%a,a);}intmain(){intc;scanf("%d",&c);for(;c>0;c--){// 입력 및 그래프 정보 G 셋팅intv,e,n;scanf("%d%d%d",&v,&e,&n);G.resize(v);inta,b,t;for(inti=0;i<e;i++){scanf("%d%d%d",&a,&b,&t);a--;b--;G[a].push_back(make_pair(t,b));G[b].push_back(make_pair(t,a));}// 다익스트라for(inti=0;i<v;i++)dist[i]=INF;dist[0]=0;Q.push(make_pair(0,0));while(!Q.empty()){intcur=Q.top().first,index=Q.top().second;Q.pop();if(cur<=dist[index]){for(inti=0;i<G[index].size();i++){if(dist[G[index][i].second]>cur+G[index][i].first){dist[G[index][i].second]=cur+G[index][i].first;Q.push(make_pair(dist[G[index][i].second],G[index][i].second));}}}}//dfs1과 dfs2를 돌려 위에서 언급한 최단거리 경로 갯수를 구함intd1[MAX]={0,},d2[MAX]={0,};for(inti=0;i<v;i++)d1[i]=d2[i]=-1;d1[v-1]=1;dfs1(0,d1);d2[0]=1;dfs2(v-1,d2);for(inti=0;i<v;i++){if(d1[i]==-1)d1[i]=0;if(d2[i]==-1)d2[i]=0;}// 확률을 알고자 하는 노드 번호를 입력받아 기약분수 계산하여 출력for(inti=0;i<n;i++){inttmp,num,denum;scanf("%d",&tmp);num=d1[tmp-1]*d2[tmp-1];denum=d1[0];tmp=gcd(num,denum);printf("%d/%d\n",num/tmp,denum/tmp);}//그래프 초기화G.clear();}return0;}
hydrogen
계속 오답이 뜨네요...
제가 한 방법은
1. 다익스트라 알고리즘으로 각 노드 별로 최단거리를 구한다.
2. 최단거리 정보를 이용해 재귀를 돌려서 1번 노드로부터 i번노드까지 최단거리 경로 갯수와 V번 노드로부터 i번 노드까지 최단거리 경로 갯수를 각각 d2, d1에 저장한다.
3. i번 노드를 지나가는 경로 개수는 d1[i-1]*d2[i-1]이고, 총 최단거리 경로 갯수는 d10이다. 기약분수로 바꿔서 출력한다.
알고리즘에 이상이 있나요?
11년 전