| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:附上代码。。能帮我看看吗In Reply To:wa到无语。。。。。。。。。。。。。。 Posted by:DieIng at 2008-08-17 02:30:25 #include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 1100
const int NIL = INT_MAX ;
struct way
{
int s;
int d;
bool operator <(const way k)const
{
return d < k.d;
}
};
struct point//储存每个点的id和他最后的距离d
{
int d,id;
bool operator <(const point a)const
{
if(d == a.d)return id < a.id;
return d > a.d;
}
}p[MAXN];
int n,ans[MAXN];
int map[MAXN][MAXN];
bool flag[MAXN];
void dijk()//dijk求出每个点的最短路径
{
priority_queue<way>Q;
way temp,e;
e.s = 2;
e.d = 0;
p[e.s].d = e.d;
Q.push(e);
while(!Q.empty())
{
e=Q.top();
Q.pop();
if(flag[e.s])continue;
flag[e.s] = 1;
for(int i = 1;i <= n; i++)
{
if(!flag[i] && map[e.s][i] != NIL && p[i].d > p[e.s].d + map[e.s][i] )
{
temp.s = i;
temp.d = p[e.s].d + map[e.s][i];
p[i].d = temp.d;
Q.push(temp);
}
}
}
}
void init(int m)//初始化
{
int i,j;
int a,b,c;
for(i = 1; i <= n; ++i)
{
p[i].id = i;
flag[i] = 0;
p[i].d = NIL;
ans[i] = 0;
for(j = 1; j <= n; ++j)map[i][j] = NIL;
}
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b] = c;
map[b][a] = c;
}
}
void dp()
{
int i,j;
for(i = 1; i <= n; ++i)if(p[i].id == 1)break;//先找出起点1
ans[p[i].id] = 1;
for(i; i < n; i++)
for(j = i + 1; j <= n; j++)
if(map[ p[j].id ][ p[i].id ] != NIL && p[j].d < p[i].d)//如果两个有边而且不等于则这条路径合法
ans[ p[j].id ] += ans[ p[i].id ];
}
int main()
{
// freopen("data.txt","r",stdin);
int m;
while(scanf("%d",&n))
{
if(n == 0)break;
scanf("%d",&m);
init(m);
dijk();
sort(p + 1,p + n + 1);//按照每个点从大到小的距离排序
dp();
printf("%d\n",ans[2]);//最后的答案就是终点ans[2]
}
return 0;
}
这是我的代码。。。有注释。应该不难看懂。希望大牛帮忙啊
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator