다익스트라로 돌리면서 이전 index값 찾고 그걸 가지고 카운팅했는데.. WA가 나오네요.
한번 어디가 틀렸는지 찾아봐주실수 있으신가요? ㅠ.ㅠ
부탁드립니다;;
#include
#include
#include
#include
#include
#define MAX 101
#define INT_MAX 9999999
using namespace std;
int V;
int E;
int N;
int g[MAX][MAX];
int in[MAX];
int cost[MAX];
set indexes[MAX];
int cnt[MAX];
priority_queue, vector >, greater > > que;
int gcd(int m, int n)
{
while (n != 0)
{
int r = m % n;
m = n;
n = r;
}
return m;
}
int calcCnt(int n)
{
int temp = 0;
if ( indexes[n].size() > 0 )
{
for (set::iterator it = indexes[n].begin(); it != indexes[n].end(); it ++)
{
temp += calcCnt(*it);
}
}
else
{
temp = 1;
}
cnt[n] += temp;
return temp;
}
void solve()
{
memset(cnt, 0, sizeof(cnt));
for(int i = 0; i <= N; i ++)
{
indexes[i].clear();
}
for(int i = 0; i <= V; i ++)
{
cost[i] = INT_MAX;
}
que.push(make_pair(0, 1));
while (!que.empty())
{
pair now = que.top();
que.pop();
if ( cost[now.second] < now.first )
{
continue;
}
for ( int i = 1; i <= V; i ++)
{
if (g[now.second][i] != 0)
{
int temp = now.first + g[now.second][i];
if (cost[i] >= temp)
{
cost[i] = temp;
que.push(make_pair(temp, i));
indexes[i].insert(now.second);
}
}
}
}
calcCnt(V);
for (int i = 0; i < N; i ++)
{
int gcdValue = gcd(cnt[V], cnt[in[i]]);
printf("%d/%d\n", cnt[in[i]]/gcdValue, cnt[V]/gcdValue);
}
}
int main()
{
int c;
scanf("%d", &c);
while (c--)
{
scanf("%d %d %d", &V, &E, &N);
memset(g, 0, sizeof(g));
for (int i = 0; i < E; i ++)
{
int s, t, v;
scanf("%d %d %d", &s, &t, &v);
g[s][t] = v;
}
for (int i = 0; i < N; i ++)
{
scanf("%d", &in[i]);
}
solve();
}
return 0;
}
12년 전
0개의 댓글이 있습니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면
온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야
합니다. 현재 문제를 푸셨습니다.
코시
후.. 맞는거 같은데 틀리니 어렵네요.. 인풋이 복잡해서 반례 찾기도 힘들구요 ㅠ.ㅠ
아.. 어디가 틀렸는지 좀 봐주실수 있으신가요?
다익스트라로 돌리면서 이전 index값 찾고 그걸 가지고 카운팅했는데.. WA가 나오네요.
한번 어디가 틀렸는지 찾아봐주실수 있으신가요? ㅠ.ㅠ
부탁드립니다;;
12년 전